This is an automated email from the ASF dual-hosted git repository.

matthiasblaesing 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 fa4d33d1a1 JS: Improve handling of export declarations (references and 
classes)
     new 9c6309109e Merge pull request #5796 from 
matthiasblaesing/js_improvements5
fa4d33d1a1 is described below

commit fa4d33d1a198d99b21205c22ba1e02bc3b66e47a
Author: Matthias Bläsing <mblaes...@doppel-helix.eu>
AuthorDate: Fri Apr 7 22:37:54 2023 +0200

    JS: Improve handling of export declarations (references and classes)
    
    At least two issues are fixed by this:
    
    - "export class XY" construct is not parsed correctly resulting in
      a JS model for that class, that his missing methods
    - "class XY {}; export {XY}" is not correctly parsed resulting missing
      declaration handling for that member
    
    Example that was not correctly parsed:
    
    ```
    export class test {
            method(param){
                    param;
            }
    };
    
    // this shows in navigator / highlighting works
    class test2{
            method(param){
                    param;
            }
    }
    
    // no highlighting, Go to declaration does not work
    export {test2};
    ```
    
    Closes: #5184
---
 .../testfiles/markoccurences/issueGH5184_01.js     | 23 +++++++++++++++++++++
 ...ssueGH5184_01.js.testIssueGH5184_01.occurrences |  2 ++
 .../editor/navigation/GoToDeclarationTest.java     |  5 ++++-
 .../editor/navigation/MarkOccurrenceTest.java      |  6 +++++-
 .../modules/javascript2/model/ModelVisitor.java    | 24 ++++++++++++++++++++--
 .../data/testfiles/structure/issueGH5184_02.js     | 23 +++++++++++++++++++++
 .../testfiles/structure/issueGH5184_02.js.model    | 11 ++++++++++
 .../modules/javascript2/model/ModelTest.java       |  4 ++++
 .../src/com/oracle/js/parser/DumpingVisitor.java   |  4 +++-
 9 files changed, 97 insertions(+), 5 deletions(-)

diff --git 
a/webcommon/javascript2.editor/test/unit/data/testfiles/markoccurences/issueGH5184_01.js
 
b/webcommon/javascript2.editor/test/unit/data/testfiles/markoccurences/issueGH5184_01.js
new file mode 100644
index 0000000000..aca8114b1f
--- /dev/null
+++ 
b/webcommon/javascript2.editor/test/unit/data/testfiles/markoccurences/issueGH5184_01.js
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+class test2 {
+}
+
+export {test2};
diff --git 
a/webcommon/javascript2.editor/test/unit/data/testfiles/markoccurences/issueGH5184_01.js.testIssueGH5184_01.occurrences
 
b/webcommon/javascript2.editor/test/unit/data/testfiles/markoccurences/issueGH5184_01.js.testIssueGH5184_01.occurrences
new file mode 100644
index 0000000000..25bdaf9d3b
--- /dev/null
+++ 
b/webcommon/javascript2.editor/test/unit/data/testfiles/markoccurences/issueGH5184_01.js.testIssueGH5184_01.occurrences
@@ -0,0 +1,2 @@
+class |>MARK_OCCURRENCES:test2<| {
+export {|>MARK_OCCURRENCES:te^st2<|};
diff --git 
a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/GoToDeclarationTest.java
 
b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/GoToDeclarationTest.java
index c196fceeb1..60557d7629 100644
--- 
a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/GoToDeclarationTest.java
+++ 
b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/GoToDeclarationTest.java
@@ -137,5 +137,8 @@ public class GoToDeclarationTest extends JsTestBase {
     public void testImportedFile_03() throws Exception {
         
checkDeclaration("testfiles/ecmascript6/importExport/importFindDeclaration01.js",
 "import { text as text3 } from \"l^ib/export02\";", "export02.js", 0);
     }
-    
+
+    public void testIssueGH5184_01() throws Exception {
+        checkDeclaration("testfiles/markoccurences/issueGH5184_01.js", "export 
{te^st2};", "class ^test2 {");
+    }
 }
diff --git 
a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/MarkOccurrenceTest.java
 
b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/MarkOccurrenceTest.java
index 8ed951f1d8..b6ddaabf8f 100644
--- 
a/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/MarkOccurrenceTest.java
+++ 
b/webcommon/javascript2.editor/test/unit/src/org/netbeans/modules/javascript2/editor/navigation/MarkOccurrenceTest.java
@@ -2243,7 +2243,11 @@ public class MarkOccurrenceTest extends JsTestBase {
     public void testIssue258724_02() throws Exception {
         checkOccurrences("testfiles/markoccurences/issue258724.js", "return 
this.ag^e;", true);
     }
-    
+
+    public void testIssueGH5184_01() throws Exception {
+        checkOccurrences("testfiles/markoccurences/issueGH5184_01.js", "export 
{te^st2};", true);
+    }
+
     private String getTestName() {
         String name = getName();
         int indexOf = name.indexOf("_");
diff --git 
a/webcommon/javascript2.model/src/org/netbeans/modules/javascript2/model/ModelVisitor.java
 
b/webcommon/javascript2.model/src/org/netbeans/modules/javascript2/model/ModelVisitor.java
index 816ce0a534..7ca7de8280 100644
--- 
a/webcommon/javascript2.model/src/org/netbeans/modules/javascript2/model/ModelVisitor.java
+++ 
b/webcommon/javascript2.model/src/org/netbeans/modules/javascript2/model/ModelVisitor.java
@@ -65,6 +65,7 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.Stack;
 import java.util.logging.Level;
@@ -696,7 +697,25 @@ public class ModelVisitor extends PathNodeVisitor 
implements ModelResolver {
         }
 
         if (className != null) {
-            classObject = new JsObjectImpl(parent, className, new 
OffsetRange(node.getStart(), node.getFinish()), true, parent.getMimeType(), 
parent.getSourceLabel());
+            // At least for exported classes multiple JsObjectImpls are created
+            // and that latest created one is missing the properties. To fix
+            // this, an existing object is checked and if it exists its
+            // properties are moved to the latest instance, creating a superset
+            // of all properties.
+            classObject = new JsObjectImpl(
+                    parent,
+                    className,
+                    new OffsetRange(node.getStart(), node.getFinish()),
+                    true,
+                    parent.getMimeType(),
+                    parent.getSourceLabel()
+            );
+            JsObject origClassObject = parent.getProperty(className.getName());
+            if (origClassObject != null) {
+                for (Entry<String, ? extends JsObject> e : 
origClassObject.getProperties().entrySet()) {
+                    ModelUtils.moveProperty(classObject, e.getValue());
+                }
+            }
             parent.addProperty(className.getName(), classObject);
             classObject.setJsKind(JsElement.Kind.CLASS);
             if (refName != null) {
@@ -837,6 +856,7 @@ public class ModelVisitor extends PathNodeVisitor 
implements ModelResolver {
 
     @Override
     public boolean enterExportNode(ExportNode exportNode) {
+        boolean result = super.enterExportNode(exportNode);
         final ExportClauseNode exportClause = exportNode.getExportClause();
         final FromNode from = exportNode.getFrom();
         final Expression expression = exportNode.getExpression();
@@ -866,7 +886,7 @@ public class ModelVisitor extends PathNodeVisitor 
implements ModelResolver {
             expression.accept(this);
             removeFromPathTheLast();
         }
-        return false;
+        return result;
     }
 
     @Override
diff --git 
a/webcommon/javascript2.model/test/unit/data/testfiles/structure/issueGH5184_02.js
 
b/webcommon/javascript2.model/test/unit/data/testfiles/structure/issueGH5184_02.js
new file mode 100644
index 0000000000..891efb6bf8
--- /dev/null
+++ 
b/webcommon/javascript2.model/test/unit/data/testfiles/structure/issueGH5184_02.js
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+export class test {
+    method1() {
+    }
+}
\ No newline at end of file
diff --git 
a/webcommon/javascript2.model/test/unit/data/testfiles/structure/issueGH5184_02.js.model
 
b/webcommon/javascript2.model/test/unit/data/testfiles/structure/issueGH5184_02.js.model
new file mode 100644
index 0000000000..92cccbba45
--- /dev/null
+++ 
b/webcommon/javascript2.model/test/unit/data/testfiles/structure/issueGH5184_02.js.model
@@ -0,0 +1,11 @@
+FUNCTION issueGH5184_02 [ANONYMOUS: false, DECLARED: true - issueGH5184_02, 
MODIFIERS: PUBLIC, FILE]
+# RETURN TYPES
+undefined, RESOLVED: true
+# PROPERTIES
+test : OBJECT test [ANONYMOUS: false, DECLARED: true - test, MODIFIERS: 
PUBLIC, CLASS]
+     # PROPERTIES
+     method1 : FUNCTION method1 [ANONYMOUS: false, DECLARED: true - method1, 
MODIFIERS: PUBLIC, METHOD]
+             # RETURN TYPES
+             undefined, RESOLVED: true
+             # PROPERTIES
+             arguments : OBJECT arguments [ANONYMOUS: false, DECLARED: false - 
arguments, MODIFIERS: PRIVATE, VARIABLE]
diff --git 
a/webcommon/javascript2.model/test/unit/src/org/netbeans/modules/javascript2/model/ModelTest.java
 
b/webcommon/javascript2.model/test/unit/src/org/netbeans/modules/javascript2/model/ModelTest.java
index 39fa7d24d3..efbffbb198 100644
--- 
a/webcommon/javascript2.model/test/unit/src/org/netbeans/modules/javascript2/model/ModelTest.java
+++ 
b/webcommon/javascript2.model/test/unit/src/org/netbeans/modules/javascript2/model/ModelTest.java
@@ -230,6 +230,10 @@ public class ModelTest extends ModelTestBase {
         checkModel("testfiles/model/issue251911.js");
     }
 
+    public void testIssueGH5184_02() throws Exception {
+        checkModel("testfiles/structure/issueGH5184_02.js");
+    }
+
     public void testPersonRevert() throws Exception {
         FileObject fo = getTestFile("testfiles/model/person.js.model");
         try (BufferedReader reader = new BufferedReader(new 
InputStreamReader(fo.getInputStream()))) {
diff --git 
a/webcommon/libs.nashorn/test/unit/src/com/oracle/js/parser/DumpingVisitor.java 
b/webcommon/libs.nashorn/test/unit/src/com/oracle/js/parser/DumpingVisitor.java
index 36b82a12a8..76c55dda6d 100644
--- 
a/webcommon/libs.nashorn/test/unit/src/com/oracle/js/parser/DumpingVisitor.java
+++ 
b/webcommon/libs.nashorn/test/unit/src/com/oracle/js/parser/DumpingVisitor.java
@@ -59,9 +59,11 @@ class DumpingVisitor extends NodeVisitor {
             System.out.println(indent() + node.getClass().getName() + " [" + 
((LiteralNode) node).getValue() + "]");
         } else if (node instanceof FunctionNode) {
             FunctionNode fn = (FunctionNode) node;
-            System.out.printf("%s%s [%s, kind=%s, isAsync=%b, isMethod=%b]%n",
+            System.out.printf("%s%s [%s-%d, %s, kind=%s, isAsync=%b, 
isMethod=%b]%n",
                     indent(),
                     node.getClass().getName(),
+                    fn.getStart(),
+                    fn.getFinish(),
                     fn.getName(),
                     fn.getKind().name(),
                     fn.isAsync(),


---------------------------------------------------------------------
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

Reply via email to