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