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

Harbs pushed a commit to branch codegraph
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git


The following commit(s) were added to refs/heads/codegraph by this push:
     new 98758c2da Enhance Code Graph functionality: implement package-level 
definitions with focused coverage, add packageCallable method, and introduce 
tests for package definitions and callable symbols.
98758c2da is described below

commit 98758c2da3412ec77efed8e0a73b495a9ea48bee
Author: Harbs <[email protected]>
AuthorDate: Fri Jul 31 14:42:07 2026 +0300

    Enhance Code Graph functionality: implement package-level definitions with 
focused coverage, add packageCallable method, and introduce tests for package 
definitions and callable symbols.
---
 CODEGRAPH_EXPORTER_IMPLEMENTATION_PLAN.md          |  2 +-
 .../internal/codegen/graph/CodeGraphExporter.java  | 33 +++++++++++++-----
 .../internal/codegen/graph/CodeGraphIdFactory.java | 14 +++++++-
 .../codegen/graph/TestCodeGraphExporter.java       | 40 ++++++++++++++++++++++
 .../codegen/graph/TestCodeGraphIdFactory.java      |  8 +++++
 .../test/resources/codegraph/golden/GraphRoot.as   |  2 +-
 .../test/resources/codegraph/golden/GraphRoot.json | 27 +++++++++++++++
 .../resources/codegraph/golden/packageFunction.as  |  7 ++++
 8 files changed, 122 insertions(+), 11 deletions(-)

diff --git a/CODEGRAPH_EXPORTER_IMPLEMENTATION_PLAN.md 
b/CODEGRAPH_EXPORTER_IMPLEMENTATION_PLAN.md
index f29b495c4..ca667d30d 100644
--- a/CODEGRAPH_EXPORTER_IMPLEMENTATION_PLAN.md
+++ b/CODEGRAPH_EXPORTER_IMPLEMENTATION_PLAN.md
@@ -299,7 +299,7 @@ Passing the existing suite is necessary but not sufficient: 
the new client must
 
 ### PR 2: Completeness
 
-- Package-level definitions.
+- Package-level definitions. Implemented with focused 
function/variable/constant coverage and a compiler-backed reachable 
package-function fixture.
 - External and unresolved symbol records.
 - Inheritance/override edges.
 - Effective inherited public member view if clients require it.
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphExporter.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphExporter.java
index 7d311568a..9b47d34b3 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphExporter.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphExporter.java
@@ -68,8 +68,14 @@ public final class CodeGraphExporter
         }
         for (IDefinition definition : definitions)
         {
-            if (definition.isPublic() && isSupportedType(definition))
+            if (!definition.isPublic())
+                continue;
+            if (isSupportedType(definition))
                 model.addSymbol(exportType((ITypeDefinition)definition));
+            else if (definition instanceof IFunctionDefinition)
+                
model.addSymbol(exportFunction((IFunctionDefinition)definition, null));
+            else if (definition instanceof IVariableDefinition)
+                
model.addSymbol(exportVariable((IVariableDefinition)definition, null));
         }
         for (ITypeDefinition externalDefinition : externalDefinitions.values())
         {
@@ -127,7 +133,12 @@ public final class CodeGraphExporter
     {
         String kind;
         String id;
-        if (definition instanceof IGetterDefinition)
+        if (declaringType == null)
+        {
+            kind = "function";
+            id = createCallableId(definition, null);
+        }
+        else if (definition instanceof IGetterDefinition)
         {
             kind = "getter";
             id = CodeGraphIdFactory.accessor(declaringType.getQualifiedName(), 
definition.getBaseName(), true);
@@ -147,7 +158,8 @@ public final class CodeGraphExporter
                 definition.getPackageName(), kind);
         addMetadata(symbol, definition);
         addASDoc(symbol, definition);
-        symbol.setDeclaringType(createReference(declaringType));
+        if (declaringType != null)
+            symbol.setDeclaringType(createReference(declaringType));
         if (definition instanceof IGetterDefinition || definition instanceof 
ISetterDefinition)
         {
             ITypeDefinition typeDefinition = definition.resolveType(project);
@@ -183,18 +195,23 @@ public final class CodeGraphExporter
         }
         if (definition.isConstructor())
             return 
CodeGraphIdFactory.constructor(declaringType.getQualifiedName(), 
parameterTypes);
+        if (declaringType == null)
+            return 
CodeGraphIdFactory.packageCallable(definition.getQualifiedName(), 
parameterTypes);
         return CodeGraphIdFactory.callable(declaringType.getQualifiedName(), 
definition.getBaseName(), parameterTypes);
     }
 
     private CodeGraphSymbol exportVariable(IVariableDefinition definition, 
ITypeDefinition declaringType)
     {
-        String kind = definition instanceof IConstantDefinition ? "constant" : 
"field";
-        CodeGraphSymbol symbol = new CodeGraphSymbol(
-                CodeGraphIdFactory.member(declaringType.getQualifiedName(), 
definition.getBaseName()),
+        String kind = definition instanceof IConstantDefinition ? "constant"
+            : declaringType == null ? "variable" : "field";
+        String id = declaringType == null ? 
CodeGraphIdFactory.definition(definition.getQualifiedName())
+            : CodeGraphIdFactory.member(declaringType.getQualifiedName(), 
definition.getBaseName());
+        CodeGraphSymbol symbol = new CodeGraphSymbol(id,
                 definition.getQualifiedName(), definition.getBaseName(), 
definition.getPackageName(), kind);
         addMetadata(symbol, definition);
-            addASDoc(symbol, definition);
-        symbol.setDeclaringType(createReference(declaringType));
+        addASDoc(symbol, definition);
+        if (declaringType != null)
+            symbol.setDeclaringType(createReference(declaringType));
         ITypeDefinition typeDefinition = definition.resolveType(project);
         if (typeDefinition != null)
             symbol.setType(createReference(typeDefinition));
diff --git 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphIdFactory.java
 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphIdFactory.java
index ed745c4f9..82fbb5a1e 100644
--- 
a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphIdFactory.java
+++ 
b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/graph/CodeGraphIdFactory.java
@@ -47,6 +47,19 @@ public final class CodeGraphIdFactory
     public static String callable(String ownerQualifiedName, String 
callableName, List<String> parameterTypes)
     {
         StringBuilder result = new StringBuilder(member(ownerQualifiedName, 
callableName));
+        appendParameters(result, parameterTypes);
+        return result.toString();
+    }
+
+    public static String packageCallable(String qualifiedName, List<String> 
parameterTypes)
+    {
+        StringBuilder result = new StringBuilder(definition(qualifiedName));
+        appendParameters(result, parameterTypes);
+        return result.toString();
+    }
+
+    private static void appendParameters(StringBuilder result, List<String> 
parameterTypes)
+    {
         result.append('(');
         for (int i = 0; i < parameterTypes.size(); i++)
         {
@@ -55,7 +68,6 @@ public final class CodeGraphIdFactory
             result.append(parameterTypes.get(i));
         }
         result.append(')');
-        return result.toString();
     }
 
     public static String constructor(String ownerQualifiedName, List<String> 
parameterTypes)
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphExporter.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphExporter.java
index 0f3619ec2..0df5e9848 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphExporter.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphExporter.java
@@ -25,11 +25,14 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.royale.compiler.definitions.IDefinition;
 import org.apache.royale.compiler.internal.test.ASTestBase;
 import org.apache.royale.compiler.tree.as.IClassNode;
+import org.apache.royale.compiler.tree.as.IFileNode;
 import org.junit.Test;
 
 public class TestCodeGraphExporter extends ASTestBase
@@ -123,6 +126,43 @@ public class TestCodeGraphExporter extends ASTestBase
         assertEquals("selected", 
metadata.get(1).getAttributes().get(0).getValue());
     }
 
+        @Test
+        public void testPackageDefinitionsAreCollectedSemantically()
+        {
+                IFileNode fileNode = compileAS("package example {"
+                                + "public function 
parseValue(value:String):Boolean { return true; }"
+                                + "public var current:String;"
+                                + "public const VERSION:Number = 1;"
+                                + "}");
+                List<IDefinition> definitions = 
Arrays.asList(fileNode.getTopLevelDefinitions(true, false));
+
+                CodeGraphModel model = new 
CodeGraphExporter(project).export(definitions, "js", null);
+
+                assertEquals(3, model.getSymbols().size());
+                CodeGraphSymbol function = findSymbol(model, "function");
+                assertEquals("as3://example/parseValue(String)", 
function.getId());
+                assertNull(function.getDeclaringType());
+                assertEquals("Boolean", 
function.getReturnType().getQualifiedName());
+                assertEquals("String", 
function.getParameters().get(0).getType().getQualifiedName());
+                CodeGraphSymbol variable = findSymbol(model, "variable");
+                assertEquals("as3://example/current", variable.getId());
+                assertEquals("String", variable.getType().getQualifiedName());
+                assertNull(variable.getDeclaringType());
+                CodeGraphSymbol constant = findSymbol(model, "constant");
+                assertEquals("as3://example/VERSION", constant.getId());
+                assertEquals("Number", constant.getType().getQualifiedName());
+        }
+
+        private CodeGraphSymbol findSymbol(CodeGraphModel model, String kind)
+        {
+                for (CodeGraphSymbol symbol : model.getSymbols())
+                {
+                        if (kind.equals(symbol.getKind()))
+                                return symbol;
+                }
+                throw new AssertionError("Expected " + kind + " symbol");
+        }
+
     private CodeGraphSymbol findMember(CodeGraphSymbol owner, String kind)
     {
         for (CodeGraphSymbol member : owner.getMembers())
diff --git 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphIdFactory.java
 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphIdFactory.java
index 8ec8cd714..d5d088bb4 100644
--- 
a/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphIdFactory.java
+++ 
b/compiler-jx/src/test/java/org/apache/royale/compiler/internal/codegen/graph/TestCodeGraphIdFactory.java
@@ -59,6 +59,14 @@ public class TestCodeGraphIdFactory
                         Arrays.asList("Number", "Boolean")));
     }
 
+        @Test
+        public void testPackageCallable()
+        {
+                
assertEquals("as3://org/apache/royale/utils/parseValue(String)",
+                                
CodeGraphIdFactory.packageCallable("org.apache.royale.utils.parseValue",
+                                                
Collections.singletonList("String")));
+        }
+
     @Test
     public void testConstructor()
     {
diff --git a/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.as 
b/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.as
index 71fba33ed..cd6192f94 100644
--- a/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.as
+++ b/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.as
@@ -17,7 +17,7 @@ package codegraph.golden
 
         public function execute(required:String, optional:Number = 2, 
...rest):Boolean
         {
-            return true;
+            return packageFunction(required);
         }
 
         private function hidden():void
diff --git a/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.json 
b/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.json
index 728ee60e6..14c3fd075 100644
--- a/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.json
+++ b/compiler-jx/src/test/resources/codegraph/golden/GraphRoot.json
@@ -221,6 +221,33 @@
       "baseName": "IGraphContract",
       "package": "codegraph.golden",
       "kind": "interface"
+    },
+    {
+      "id": "as3://codegraph/golden/packageFunction(String)",
+      "qualifiedName": "codegraph.golden.packageFunction",
+      "baseName": "packageFunction",
+      "package": "codegraph.golden",
+      "kind": "function",
+      "returnType": {
+        "id": "as3://Boolean",
+        "qualifiedName": "Boolean",
+        "external": true,
+        "unresolved": false
+      },
+      "parameters": [
+        {
+          "name": "value",
+          "type": {
+            "id": "as3://String",
+            "qualifiedName": "String",
+            "external": true,
+            "unresolved": false
+          },
+          "optional": false,
+          "rest": false,
+          "defaultValue": null
+        }
+      ]
     }
   ],
   "externalSymbols": [
diff --git a/compiler-jx/src/test/resources/codegraph/golden/packageFunction.as 
b/compiler-jx/src/test/resources/codegraph/golden/packageFunction.as
new file mode 100644
index 000000000..45669d536
--- /dev/null
+++ b/compiler-jx/src/test/resources/codegraph/golden/packageFunction.as
@@ -0,0 +1,7 @@
+package codegraph.golden
+{
+    public function packageFunction(value:String):Boolean
+    {
+        return value != null;
+    }
+}
\ No newline at end of file

Reply via email to