Merge pull request #2159 from apache/master

Sync master to release 12.0 beta 6
diff --git a/apisupport/apisupport.wizards/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModel.java b/apisupport/apisupport.wizards/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModel.java
index fd4ef21..43e2a69 100644
--- a/apisupport/apisupport.wizards/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModel.java
+++ b/apisupport/apisupport.wizards/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModel.java
@@ -21,9 +21,7 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -40,7 +38,6 @@
 import org.netbeans.modules.apisupport.project.ui.wizard.common.CreatedModifiedFiles;
 import org.netbeans.modules.apisupport.project.ui.wizard.common.BasicWizardIterator;
 import org.openide.WizardDescriptor;
-import org.openide.awt.ActionReference;
 import org.openide.filesystems.FileObject;
 import org.openide.filesystems.FileSystem;
 import org.openide.filesystems.FileUtil;
@@ -253,7 +250,7 @@
         }
         
         if (annotations) {
-            List<ActionReference> refs = new ArrayList<ActionReference>();
+            List<ActionReferenceModel> refs = new ArrayList<>();
             // create layer entry for global menu item
             if (globalMenuItemEnabled) {
                 refs.add(createActionReference(
@@ -624,46 +621,58 @@
         this.edContextSeparatorBefore = separator;
     }
 
-    static ActionReference createActionReference(
+    static class ActionReferenceModel implements Serializable {
+        String parentPath;
+        String name;
+        int beforeSep;
+        int afterSep;
+        int position;
+
+        public ActionReferenceModel(String parentPath, String name, int beforeSep, int afterSep, int position) {
+            this.parentPath = parentPath;
+            this.name = name;
+            this.beforeSep = beforeSep;
+            this.afterSep = afterSep;
+            this.position = position;
+        }
+
+        public String path() {
+            return parentPath;
+        }
+
+        public int position() {
+            return position;
+        }
+
+        public String name() {
+            return name == null ? "" : name;
+        }
+
+        public int separatorBefore() {
+            return beforeSep;
+        }
+
+        public int separatorAfter() {
+            return afterSep;
+        }
+
+        @Override
+        public String toString() {
+            return "ActionReferenceModel{" + "parentPath=" + parentPath + ", name=" + name + ", beforeSep=" + beforeSep + ", afterSep=" + afterSep + ", position=" + position + '}';
+        }
+
+
+    }
+
+    static ActionReferenceModel createActionReference(
         final String parentPath, 
         final int beforeSep, 
         final int afterSep, 
         final int position, 
         final String name
     ) {
-        class H implements InvocationHandler {
-            @Override
-            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-                if (method.getName().equals("path")) {
-                    return parentPath;
-                }
-                if (method.getName().equals("position")) {
-                    return position;
-                }
-                if (method.getName().equals("separatorBefore")) {
-                    return beforeSep;
-                }
-                if (method.getName().equals("separatorAfter")) {
-                    return afterSep;
-                }
-                if (method.getName().equals("name")) {
-                    return name == null ? "" : name;
-                }
-                if (method.getName().equals("equals")) {
-                    return this == Proxy.getInvocationHandler(proxy);
-                }
-                if (method.getName().equals("hashCode")) {
-                    return hashCode();
-                }
-                return null;
-            }
-        }
-                
-        return (ActionReference) Proxy.newProxyInstance(
-            ActionReference.class.getClassLoader(), 
-            new Class[] { ActionReference.class }, 
-            new H()
-        );
+
+        return new ActionReferenceModel(parentPath, name, beforeSep, afterSep, position);
     }
 
     void setSFS(FileSystem sfs) {
diff --git a/apisupport/apisupport.wizards/test/unit/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModelTest.java b/apisupport/apisupport.wizards/test/unit/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModelTest.java
index 2103e5f..ab175c1 100644
--- a/apisupport/apisupport.wizards/test/unit/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModelTest.java
+++ b/apisupport/apisupport.wizards/test/unit/src/org/netbeans/modules/apisupport/project/ui/wizard/action/DataModelTest.java
@@ -20,7 +20,7 @@
 package org.netbeans.modules.apisupport.project.ui.wizard.action;
 
 import org.netbeans.junit.NbTestCase;
-import org.openide.awt.ActionReference;
+import org.netbeans.modules.apisupport.project.ui.wizard.action.DataModel.ActionReferenceModel;
 
 /**
  * Tests {@link DataModel}.
@@ -34,7 +34,7 @@
     }
     
     public void testActionReferenceCreate() throws Exception {
-        ActionReference res = DataModel.createActionReference("mypath/sub", 30, 130, 100, "myname");
+        ActionReferenceModel res = DataModel.createActionReference("mypath/sub", 30, 130, 100, "myname");
         assertEquals("mypath/sub", res.path());
         assertEquals(100, res.position());
         assertEquals("myname", res.name());
diff --git a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLexer.java b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLexer.java
index 9b189ff..3c7dd55 100644
--- a/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLexer.java
+++ b/ide/languages.yaml/src/org/netbeans/modules/languages/yaml/YamlLexer.java
@@ -468,6 +468,12 @@
             case ISA_CURLY:
                 state = ISI_WHITESPACE;
                 return token(YamlTokenId.TEXT);
+            case ISI_MUSTACHE:
+                state = ISI_WHITESPACE;
+                return token(YamlTokenId.MUSTACHE);
+            case ISI_MUSTACHE_QUOTE:
+                state = ISI_WHITESPACE;
+                return token(YamlTokenId.MUSTACHE);
             case ISI_PHP:
                 state = ISI_WHITESPACE;
                 return token(YamlTokenId.PHP);
diff --git a/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_1.yaml.txt b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_1.yaml.txt
new file mode 100644
index 0000000..07f6ba4
--- /dev/null
+++ b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_1.yaml.txt
@@ -0,0 +1,3 @@
+.t.e.s.t. SimpleMustache
+k: {{a
+.e.o.f.
\ No newline at end of file
diff --git a/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_1.yaml.txt.tokens.txt b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_1.yaml.txt.tokens.txt
new file mode 100644
index 0000000..57a900d
--- /dev/null
+++ b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_1.yaml.txt.tokens.txt
@@ -0,0 +1,9 @@
+.t.e.s.t. SimpleMustache
+TEXT            "k: ", la=2, st=0
+MUSTACHE_DELIMITER  "{{", st=13
+MUSTACHE        "a", la=1, st=0
+----- EOF -----
+
+<Unnamed test>
+----- EOF -----
+
diff --git a/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_2.yaml.txt b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_2.yaml.txt
new file mode 100644
index 0000000..b967254
--- /dev/null
+++ b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_2.yaml.txt
@@ -0,0 +1,3 @@
+.t.e.s.t. SimpleMustacheQuote
+k: {{ '}}
+.e.o.f.
\ No newline at end of file
diff --git a/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_2.yaml.txt.tokens.txt b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_2.yaml.txt.tokens.txt
new file mode 100644
index 0000000..7e811bf
--- /dev/null
+++ b/ide/languages.yaml/test/unit/data/testfiles/issue_NETBEANS-4370_2.yaml.txt.tokens.txt
@@ -0,0 +1,9 @@
+.t.e.s.t. SimpleMustacheQuote
+TEXT            "k: ", la=2, st=0
+MUSTACHE_DELIMITER  "{{", st=13
+MUSTACHE        " '}}", la=1, st=0
+----- EOF -----
+
+<Unnamed test>
+----- EOF -----
+
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 e0463ef..18886f1 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
@@ -65,7 +65,17 @@
                 YamlTokenId.language());
     }
 
-     public void testIssue246124() throws Exception {
+    public void testNETBEANS_4370_1() throws Exception {
+        LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4370_1.yaml.txt",
+                YamlTokenId.language());
+    }
+
+    public void testNETBEANS_4370_2() throws Exception {
+        LexerTestUtilities.checkTokenDump(this, "testfiles/issue_NETBEANS-4370_2.yaml.txt",
+                YamlTokenId.language());
+    }
+
+    public void testIssue246124() throws Exception {
         LexerTestUtilities.checkTokenDump(this, "testfiles/issue246124.yaml",
                 YamlTokenId.language());
     }
diff --git a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ParameterNameProviderImpl.java b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ParameterNameProviderImpl.java
index efaf35c..3bc125c 100644
--- a/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ParameterNameProviderImpl.java
+++ b/java/java.source.base/src/org/netbeans/modules/java/source/parsing/ParameterNameProviderImpl.java
@@ -208,7 +208,7 @@
 
     static void capCache(LinkedHashMap<String, ?> map) {
         Iterator<String> it = map.keySet().iterator();
-        while (map.size() > MAX_CACHE_SIZE) {
+        while (map.size() > MAX_CACHE_SIZE && it.hasNext()) {
             it.next();
             it.remove();
         }