This is an automated email from the ASF dual-hosted git repository. lkishalmi pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push: new 4efad12307 Minor cleanup in YAML Language Support 4efad12307 is described below commit 4efad12307b79f8314edb81fe0fcac4aaffdd3ae Author: Laszlo Kishalmi <laszlo.kisha...@gmail.com> AuthorDate: Sun Sep 11 20:27:20 2022 -0700 Minor cleanup in YAML Language Support --- .../yaml/EmbeddedSectionsHighlighting.java | 4 +- .../modules/languages/yaml/YamlCompletion.java | 2 +- .../modules/languages/yaml/YamlLanguage.java | 78 +++++++- .../modules/languages/yaml/YamlParser.java | 2 +- .../modules/languages/yaml/YamlStructureItem.java | 2 +- .../modules/languages/yaml/YamlTokenId.java | 86 -------- .../languages/yaml/ruby/RubyEmbeddingProvider.java | 220 --------------------- .../modules/languages/yaml/YamlLexerTest.java | 16 +- .../modules/languages/yaml/YamlTestBase.java | 2 +- 9 files changed, 89 insertions(+), 323 deletions(-) diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java index 6711aad43c..518201974a 100644 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java +++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/EmbeddedSectionsHighlighting.java @@ -37,7 +37,7 @@ import org.netbeans.api.lexer.TokenSequence; import org.netbeans.editor.BaseDocument; import org.netbeans.editor.Utilities; import org.netbeans.lib.editor.util.swing.DocumentUtilities; -import static org.netbeans.modules.languages.yaml.YamlTokenId.YAML_MIME_TYPE; +import static org.netbeans.modules.languages.yaml.YamlLanguage.MIME_TYPE; import org.netbeans.spi.editor.highlighting.HighlightsLayer; import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory; import org.netbeans.spi.editor.highlighting.HighlightsSequence; @@ -257,7 +257,7 @@ public class EmbeddedSectionsHighlighting extends AbstractHighlightsContainer im } } // End of Highlights class - @MimeRegistration(mimeType = YAML_MIME_TYPE, service = HighlightsLayerFactory.class) + @MimeRegistration(mimeType = MIME_TYPE, service = HighlightsLayerFactory.class) public static final class Factory implements HighlightsLayerFactory { @Override diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java index 6ff30899b5..2e8e6655da 100644 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java +++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlCompletion.java @@ -326,7 +326,7 @@ public class YamlCompletion implements CodeCompletionHandler { @Override public String getMimeType() { - return YamlTokenId.YAML_MIME_TYPE; + return YamlLanguage.MIME_TYPE; } @Override diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java index 218e7e2b63..c0f59aba54 100644 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java +++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLanguage.java @@ -18,7 +18,13 @@ */ package org.netbeans.modules.languages.yaml; +import java.util.Collection; +import java.util.EnumSet; +import org.netbeans.api.lexer.InputAttributes; import org.netbeans.api.lexer.Language; +import org.netbeans.api.lexer.LanguagePath; +import org.netbeans.api.lexer.Token; +import org.netbeans.api.lexer.TokenId; import org.netbeans.core.spi.multiview.MultiViewElement; import org.netbeans.core.spi.multiview.text.MultiViewEditorElement; import org.netbeans.modules.csl.api.CodeCompletionHandler; @@ -29,6 +35,11 @@ import org.netbeans.modules.csl.api.StructureScanner; import org.netbeans.modules.csl.spi.DefaultLanguageConfig; import org.netbeans.modules.csl.spi.LanguageRegistration; import org.netbeans.modules.parsing.spi.Parser; +import org.netbeans.spi.lexer.LanguageEmbedding; +import org.netbeans.spi.lexer.LanguageHierarchy; +import org.netbeans.spi.lexer.LanguageProvider; +import org.netbeans.spi.lexer.Lexer; +import org.netbeans.spi.lexer.LexerRestartInfo; import org.openide.awt.*; import org.openide.filesystems.MIMEResolver; import org.openide.util.Lookup; @@ -102,12 +113,12 @@ import org.openide.windows.TopComponent; position = 1500 ) }) -@LanguageRegistration(mimeType = "text/x-yaml", useMultiview = true) //NOI18N +@LanguageRegistration(mimeType = YamlLanguage.MIME_TYPE, useMultiview = true) public class YamlLanguage extends DefaultLanguageConfig { @Override public Language getLexerLanguage() { - return YamlTokenId.language(); + return language(); } @Override @@ -155,12 +166,73 @@ public class YamlLanguage extends DefaultLanguageConfig { return null; } + public static final Language<YamlTokenId> language() { + return language; + } + + private static final Language<YamlTokenId> language = + new LanguageHierarchy<YamlTokenId>() { + + @Override + protected String mimeType() { + return MIME_TYPE; + } + + @Override + protected Collection<YamlTokenId> createTokenIds() { + return EnumSet.allOf(YamlTokenId.class); + } + + @Override + protected Lexer<YamlTokenId> createLexer(LexerRestartInfo<YamlTokenId> info) { + return new YamlLexer(info); + } + + @Override + protected LanguageEmbedding<? extends TokenId> embedding(Token<YamlTokenId> token, + LanguagePath languagePath, InputAttributes inputAttributes) { + switch (token.id()) { + case RUBY_EXPR: + case RUBY: + return findLanguage(YamlLanguage.RUBY_MIME_TYPE); + case PHP: + return findLanguage(YamlLanguage.PHP_MIME_TYPE); + default: + return null; + } + } + }.language(); + + private static LanguageEmbedding<? extends TokenId> findLanguage(String mimeType) { + Language<? extends TokenId> ret = null; + + Collection<? extends LanguageProvider> providers = Lookup.getDefault().lookupAll(LanguageProvider.class); + for (LanguageProvider provider : providers) { + ret = provider.findLanguage(mimeType); + if (ret != null) { + break; + } + } + + return ret != null ? LanguageEmbedding.create(ret, 0, 0, false) : null; + } + + /** + * MIME type for YAML. Don't change this without also consulting the various + * XML files that cannot reference this value directly. + */ + public static final String MIME_TYPE = "text/x-yaml"; // NOI18N + + public static final String RUBY_MIME_TYPE = "text/x-ruby"; // NOI18N + public static final String PHP_MIME_TYPE = "text/x-php5"; // NOI18N + + @NbBundle.Messages("Source=&Source") @MultiViewElement.Registration( displayName="#Source", iconBase="org/netbeans/modules/languages/yaml/yaml_files_16.png", persistenceType=TopComponent.PERSISTENCE_ONLY_OPENED, - mimeType=YamlTokenId.YAML_MIME_TYPE, + mimeType=MIME_TYPE, preferredID="yaml.source", position=100 ) diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java index 653f62837d..d734c54f8f 100644 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java +++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlParser.java @@ -258,7 +258,7 @@ public class YamlParser extends org.netbeans.modules.parsing.spi.Parser { // Construct source by removing <% %> tokens etc. StringBuilder sb = new StringBuilder(); - TokenHierarchy hi = TokenHierarchy.create(source, YamlTokenId.language()); + TokenHierarchy hi = TokenHierarchy.create(source, YamlLanguage.language()); TokenSequence ts = hi.tokenSequence(); diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java index 2fcec4ec35..339c852890 100644 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java +++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlStructureItem.java @@ -129,7 +129,7 @@ public abstract class YamlStructureItem implements StructureItem, ElementHandle @Override public String getMimeType() { - return YamlTokenId.YAML_MIME_TYPE; + return YamlLanguage.MIME_TYPE; } @Override diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java index f0fd5f60fa..dbefca3fe0 100644 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java +++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlTokenId.java @@ -18,24 +18,7 @@ */ package org.netbeans.modules.languages.yaml; -import java.util.Collection; -import java.util.EnumSet; -import java.util.HashMap; -import java.util.Map; -import org.netbeans.api.editor.mimelookup.MimeRegistration; - -import org.netbeans.api.lexer.InputAttributes; -import org.netbeans.api.lexer.Language; -import org.netbeans.api.lexer.LanguagePath; -import org.netbeans.api.lexer.Token; import org.netbeans.api.lexer.TokenId; -import org.netbeans.modules.languages.yaml.ruby.RubyEmbeddingProvider; -import org.netbeans.spi.lexer.LanguageEmbedding; -import org.netbeans.spi.lexer.LanguageHierarchy; -import org.netbeans.spi.lexer.LanguageProvider; -import org.netbeans.spi.lexer.Lexer; -import org.netbeans.spi.lexer.LexerRestartInfo; -import org.openide.util.Lookup; /** * Token type definitions for YAML @@ -79,74 +62,5 @@ public enum YamlTokenId implements TokenId { public static boolean isRuby(TokenId id) { return id == RUBY || id == RUBY_EXPR || id == RUBYCOMMENT; } - private static final Language<YamlTokenId> language = - new LanguageHierarchy<YamlTokenId>() { - - @Override - protected String mimeType() { - return YamlTokenId.YAML_MIME_TYPE; - } - - @Override - protected Collection<YamlTokenId> createTokenIds() { - return EnumSet.allOf(YamlTokenId.class); - } - - @Override - protected Map<String, Collection<YamlTokenId>> createTokenCategories() { - Map<String, Collection<YamlTokenId>> cats = - new HashMap<String, Collection<YamlTokenId>>(); - return cats; - } - - @Override - protected Lexer<YamlTokenId> createLexer(LexerRestartInfo<YamlTokenId> info) { - return new YamlLexer(info); - } - - @Override - protected LanguageEmbedding<? extends TokenId> embedding(Token<YamlTokenId> token, - LanguagePath languagePath, InputAttributes inputAttributes) { - switch (token.id()) { - case RUBY_EXPR: - case RUBY: - // No dependency on the Ruby module: - //Language rubyLanguage = RubyTokenId.language(); - Language<? extends TokenId> rubyLanguage = null; - @SuppressWarnings("unchecked") Collection<LanguageProvider> providers = (Collection<LanguageProvider>) Lookup.getDefault().lookupAll(LanguageProvider.class); - for (LanguageProvider provider : providers) { - rubyLanguage = (Language<? extends TokenId>) provider.findLanguage(RubyEmbeddingProvider.RUBY_MIME_TYPE); - if (rubyLanguage != null) { - break; - } - } - - return rubyLanguage != null ? LanguageEmbedding.create(rubyLanguage, 0, 0, false) : null; - case PHP: - Language<? extends TokenId> phpLanguage = null; - - providers = (Collection<LanguageProvider>) Lookup.getDefault().lookupAll(LanguageProvider.class); - for (LanguageProvider provider : providers) { - phpLanguage = (Language<? extends TokenId>) provider.findLanguage("text/x-php5"); - if (phpLanguage != null) { - break; - } - } - return phpLanguage != null ? LanguageEmbedding.create(phpLanguage, 0, 0, false) : null; - default: - return null; - } - } - }.language(); - - @MimeRegistration(mimeType = YAML_MIME_TYPE, service = Language.class) - public static Language<YamlTokenId> language() { - return language; - } - /** - * MIME type for YAML. Don't change this without also consulting the various - * XML files that cannot reference this value directly. - */ - public static final String YAML_MIME_TYPE = "text/x-yaml"; // NOI18N } diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/ruby/RubyEmbeddingProvider.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/ruby/RubyEmbeddingProvider.java deleted file mode 100644 index ac73ae9300..0000000000 --- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/ruby/RubyEmbeddingProvider.java +++ /dev/null @@ -1,220 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.netbeans.modules.languages.yaml.ruby; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.logging.Logger; -import javax.swing.text.Document; -import org.netbeans.api.editor.mimelookup.MimeRegistration; -import org.netbeans.api.lexer.Token; -import org.netbeans.api.lexer.TokenHierarchy; -import org.netbeans.api.lexer.TokenSequence; -import org.netbeans.editor.BaseDocument; -import org.netbeans.modules.languages.yaml.YamlTokenId; -import org.netbeans.modules.parsing.api.Embedding; -import org.netbeans.modules.parsing.api.Snapshot; -import org.netbeans.modules.parsing.spi.EmbeddingProvider; -import org.netbeans.modules.parsing.spi.SchedulerTask; -import org.netbeans.modules.parsing.spi.TaskFactory; - -/** - * - * @author Petr Hejl - */ -public class RubyEmbeddingProvider extends EmbeddingProvider { - - public static final String RUBY_MIME_TYPE = "text/x-ruby"; // NOI18N - private static final Logger LOG = Logger.getLogger(RubyEmbeddingProvider.class.getName()); - - @Override - public List<Embedding> getEmbeddings(Snapshot snapshot) { - if (YamlTokenId.YAML_MIME_TYPE.equals(snapshot.getMimeType())) { - List<Embedding> embeddings = translate(snapshot); - if (embeddings.isEmpty()) { - return Collections.<Embedding>emptyList(); - } else { - return Collections.singletonList(Embedding.create(embeddings)); - } - } else { - LOG.warning("Unexpected snapshot type: '" + snapshot.getMimeType() + "'; expecting '" + YamlTokenId.YAML_MIME_TYPE + "'"); //NOI18N - return Collections.<Embedding>emptyList(); - } - } - - @Override - public int getPriority() { - return Integer.MAX_VALUE; - } - - @Override - public void cancel() { - // FIXME parsing API - } - - private List<Embedding> translate(Snapshot snapshot) { - BaseDocument d = (BaseDocument) snapshot.getSource().getDocument(false); - if (d == null) { - return Collections.emptyList(); - } - - List<Embedding> embeddings = new ArrayList<Embedding>(); - - try { - d.readLock(); - TokenHierarchy<Document> tokenHierarchy = TokenHierarchy.get((Document) d); - TokenSequence<YamlTokenId> tokenSequence = tokenHierarchy.tokenSequence(YamlTokenId.language()); //get top level token sequence - - if (tokenSequence != null) { - translate(snapshot, tokenHierarchy, tokenSequence, embeddings); - } - } finally { - d.readUnlock(); - } - return embeddings; - } - - /** - * Perform eruby translation - * - * @param outputBuffer The buffer to emit the translation to - * @param tokenHierarchy The token hierarchy for the yaml code - * @param tokenSequence The token sequence for the yaml code - */ - private void translate(Snapshot snapshot, TokenHierarchy<Document> tokenHierarchy, - TokenSequence<? extends YamlTokenId> tokenSequence, List<Embedding> embeddings) { - // Add a super class such that code completion, goto declaration etc. - // knows where to pull the various link_to etc. methods from - - // Erubis uses _buf; I've seen eruby using something else (_erbout?) - embeddings.add(snapshot.create("_buf='';", RUBY_MIME_TYPE)); - - boolean skipNewline = false; - while (tokenSequence.moveNext()) { - Token<? extends YamlTokenId> token = tokenSequence.token(); - - if (token.id() == YamlTokenId.TEXT || token.id() == YamlTokenId.COMMENT) { - int sourceStart = token.offset(tokenHierarchy); - - String text = token.text().toString(); - - // If there is leading whitespace in this token followed by a newline, - // emit it directly first, then insert my buffer append. Otherwise, - // insert a semicolon if we're on the same line as the previous output. - boolean found = false; - int i = 0; - for (; i < text.length(); i++) { - char c = text.charAt(i); - if (c == '\n') { - i++; // include it - found = true; - break; - } else if (!Character.isWhitespace(c)) { - break; - } - } - - // avoid creating an embedding for the artificial '\n' at the end (which is now there - // as a result of the fix for #159502 - // XXX: shouldn't this be handled e.g. in token hiearchy creation?? - if (found && tokenSequence.index() < tokenSequence.tokenCount() - 1) { - embeddings.add(snapshot.create(sourceStart, i, RUBY_MIME_TYPE)); - //buffer.append(text.substring(0, i)); - text = text.substring(i); - } else { - embeddings.add(snapshot.create(";", RUBY_MIME_TYPE)); - //buffer.append(';'); - } - embeddings.add(snapshot.create("_buf << '", RUBY_MIME_TYPE)); - - if (skipNewline && text.startsWith("\n")) { // NOI18N - text = text.substring(1); - } - // Escape 's in the document so they don't escape out of the ruby code - // I don't have to do this on lines that are in comments... But no big harm - text = text.replace("'", "\\'"); - - // FIXME this escaping should be replaced with - // proper embeddings from source code - embeddings.add(snapshot.create(text, RUBY_MIME_TYPE)); - - // TODO: This "\n" shouldn't be there if the next "<%" is a "<%-" ! - embeddings.add(snapshot.create("';\n", RUBY_MIME_TYPE)); - //buffer.append("';\n"); // NOI18N - - skipNewline = false; - } else if (token.id() == YamlTokenId.RUBY) { - int sourceStart = token.offset(tokenHierarchy); - - String text = token.text().toString(); - skipNewline = false; - if (text.endsWith("-")) { // NOI18N - text = text.substring(0, text.length() - 1); - skipNewline = true; - } - - embeddings.add(snapshot.create(sourceStart, text.length(), RUBY_MIME_TYPE)); - - skipNewline = false; - } else if (token.id() == YamlTokenId.RUBY_EXPR) { - embeddings.add(snapshot.create("_buf << (", RUBY_MIME_TYPE)); - - int sourceStart = token.offset(tokenHierarchy); - - String text = token.text().toString(); - skipNewline = false; - if (text.endsWith("-")) { // NOI18N - text = text.substring(0, text.length() - 1); - skipNewline = true; - } - embeddings.add(snapshot.create(sourceStart, text.length(), RUBY_MIME_TYPE)); - -// Make code sanitizing work better: buffer.append("\n).to_s;"); // NOI18N - embeddings.add(snapshot.create(").to_s;", RUBY_MIME_TYPE)); - } - } - - // Close off the class - // eruby also ends with this statement: _buf.to_s -// String end = "\nend\n"; // NOI18N -// buffer.append(end); -// if (doc != null) { -// codeBlocks.add(new CodeBlockData(doc.getLength(), doc.getLength(), buffer.length()-end.length(), buffer.length())); -// } - } - - @MimeRegistration(mimeType = YamlTokenId.YAML_MIME_TYPE, service = TaskFactory.class) - public static final class Factory extends TaskFactory { - - public Factory() { - // no-op - } - - public @Override - Collection<? extends SchedulerTask> create(Snapshot snapshot) { - if (!YamlTokenId.YAML_MIME_TYPE.equals(snapshot.getMimeType())) { - return Collections.<SchedulerTask>emptyList(); - } - - return Collections.singleton(new RubyEmbeddingProvider()); - } - } -} diff --git a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java index 18886f1c39..834dcdca4d 100644 --- a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java +++ b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlLexerTest.java @@ -42,41 +42,41 @@ public class YamlLexerTest extends YamlTestBase { public void testInput() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/input.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testInput2() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/input2.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testInput3() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/input3.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testInput4() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/input4.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testNETBEANS_4167() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4167.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testNETBEANS_4370_1() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4370_1.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testNETBEANS_4370_2() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4370_2.yaml.txt", - YamlTokenId.language()); + YamlLanguage.language()); } public void testIssue246124() throws Exception { LexerTestUtilities.checkTokenDump(this, "testfiles/issue246124.yaml", - YamlTokenId.language()); + YamlLanguage.language()); } } diff --git a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java index 3a907e374f..348f1c3f31 100644 --- a/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java +++ b/ide/languages.yaml/test/unit/src/org/netbeans/modules/languages/yaml/YamlTestBase.java @@ -40,7 +40,7 @@ public class YamlTestBase extends CslTestBase { @Override protected String getPreferredMimeType() { - return YamlTokenId.YAML_MIME_TYPE; + return YamlLanguage.MIME_TYPE; } @Override --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists