From d9dcfaca5e1f518528c91ed790890c4322de39c7 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 15 Apr 2024 16:40:33 +0200 Subject: [PATCH 001/134] added switch expressions to Java M3 AST support --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 1 + .../lang/java/m3/internal/ASTConverter.java | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 58de33944a7..b364f35c789 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -75,6 +75,7 @@ data Expression | \postfix(Expression operand, str operator) | \prefix(str operator, Expression operand) | \simpleName(str name) + | \switch(Expression expression, list[Statement] cases) | \markerAnnotation(str typeName) | \normalAnnotation(str typeName, list[Expression] memberValuePairs) | \memberValuePair(str name, Expression \value) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index c51a15b4703..0056b7b2425 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -879,6 +879,21 @@ public boolean visit(LambdaExpression node) { return false; } + @Override + public boolean visit(SwitchExpression node) { + IValue expression = visitChild(node.getExpression()); + + IValueList statements = new IValueList(values); + for (Iterator it = node.statements().iterator(); it.hasNext();) { + Statement s = (Statement) it.next(); + statements.add(visitChild(s)); + } + + ownValue = constructExpressionNode("switch", expression, statements.asList()); + + return false; + } + public boolean visit(SuperConstructorInvocation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); @@ -941,9 +956,8 @@ public boolean visit(SuperMethodInvocation node) { return false; } + // TODO: add suppor for multiple expressions, and the -> arrow public boolean visit(SwitchCase node) { - - IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); String constructorName = "case"; From f42c97e7ddb50cde9544846a9fe83b7af534b05f Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 16 Apr 2024 13:49:57 +0200 Subject: [PATCH 002/134] starting to weed out all the different language levels --- .../rascalmpl/library/lang/java/m3/AST.rsc | 3 +- .../lang/java/m3/internal/ASTConverter.java | 55 ++++++++++++++++--- .../java/m3/internal/EclipseJavaCompiler.java | 5 +- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index b364f35c789..c8edf6ba412 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -103,7 +103,8 @@ data Statement | \return(Expression expression) | \return() | \switch(Expression expression, list[Statement] statements) - | \case(Expression expression) + | \case(list[Expression] expressions) + | \switchLabeledRule(list[Expression] expressions) | \defaultCase() | \synchronizedStatement(Expression lock, Statement body) | \throw(Expression expression) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 0056b7b2425..01a6ad22e72 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1,10 +1,12 @@ package org.rascalmpl.library.lang.java.m3.internal; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.eclipse.jdt.core.dom.*; +import io.usethesource.vallang.IList; import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IString; @@ -604,12 +606,23 @@ public boolean visit(MethodDeclaration node) { parameters.append(visitChild(v)); } - IValueList possibleExceptions = new IValueList(values); - if (!node.thrownExceptions().isEmpty()) { + IListWriter possibleExceptions = values.listWriter(); - for (Iterator it = node.thrownExceptions().iterator(); it.hasNext();) { - Name n = (Name) it.next(); - possibleExceptions.add(visitChild(n)); + var apiLevel = node.getAST().apiLevel(); + if (apiLevel == AST.JLS2 || apiLevel == AST.JLS3 || apiLevel == AST.JLS4) { + if (!node.thrownExceptions().isEmpty()) { + for (Iterator it = node.thrownExceptions().iterator(); it.hasNext();) { + Name n = (Name) it.next(); + possibleExceptions.append(visitChild(n)); + } + } + } + else { + if (!node.thrownExceptionTypes().isEmpty()) { + ((List) node.thrownExceptionTypes()).stream() + .map(o -> ((ASTNode) o)) + .map((ASTNode n) -> visitChild(n)) + .collect(possibleExceptions); } } @@ -618,7 +631,7 @@ public boolean visit(MethodDeclaration node) { body = constructStatementNode("empty"); } - ownValue = constructDeclarationNode(constructorName, returnType, name, parameters.done(), possibleExceptions.asList(), body); + ownValue = constructDeclarationNode(constructorName, returnType, name, parameters.done(), possibleExceptions.done(), body); setKeywordParameters("modifiers", extendedModifiers); // FIXME: this doesn't seem to be in use anymore //setKeywordParameters("typeParameters", genericTypes); @@ -956,19 +969,43 @@ public boolean visit(SuperMethodInvocation node) { return false; } - // TODO: add suppor for multiple expressions, and the -> arrow + public boolean visit(SwitchCase node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); + List expressions = node.expressions(); + String constructorName = "case"; - if (node.isDefault()) + IList exprs = expression == null + ? values.list(expression) + : expressions.stream() + .map(o -> (Expression) o) + .map(e -> visitChild(e)).collect(values.listWriter()); + + if (node.isSwitchLabeledRule()) { + constructorName = "switchLabeledRule"; + } + else if (node.isDefault()) { constructorName = "defaultCase"; + } - ownValue = constructStatementNode(constructorName, expression); + ownValue = constructStatementNode(constructorName, exprs); return false; } + @Override + public boolean visit(TypeMethodReference node) { + // TODO Auto-generated method stub + return super.visit(node); + } + + @Override + public boolean visit(ExpressionMethodReference node) { + // TODO Auto-generated method stub + return super.visit(node); + } + public boolean visit(SwitchStatement node) { IValue expression = visitChild(node.getExpression()); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index f044df7c7b9..3eb7d7e019d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -218,6 +218,7 @@ protected void buildCompilationUnits(ISet files, boolean resolveBindings, boolea } ASTParser parser = constructASTParser(resolveBindings, errorRecovery, javaVersion, translatePaths(sourcePath), translatePaths(classPath)); + parser.createASTs(absolutePaths, encodings, new String[0], new FileASTRequestor() { @Override public void acceptAST(String sourceFilePath, CompilationUnit ast) { @@ -292,11 +293,11 @@ protected IValue convertToAST(IBool collectBindings, Map options = new Hashtable(); From a30fa234d19d80e8217ffb7378d33160f57c1388 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 16 Apr 2024 19:58:22 +0200 Subject: [PATCH 003/134] revamped JLS level selection parameter and added preview features support --- .../rascalmpl/library/lang/java/m3/AST.rsc | 27 ++++++++++++--- .../java/m3/internal/EclipseJavaCompiler.java | 34 ++++++++++--------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index c8edf6ba412..1b664d12317 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -11,6 +11,23 @@ import IO; import String; import List; +@synopsis{Datatype to configure the Java Language Standard compliance level of the parser.} +data JavaVersion = javaVersion(int level, str version, bool preview=true); + +JavaVersion JLS1() = javaVersion(1, "1.1"); +JavaVersion JLS2() = javaVersion(2, "1.2"); +JavaVersion JLS3() = javaVersion(3, "1.3"); +JavaVersion JLS4() = javaVersion(4, "1.4"); +JavaVersion JLS5() = javaVersion(5, "1.5"); +JavaVersion JLS6() = javaVersion(6, "1.6"); +JavaVersion JLS7() = javaVersion(7, "1.7"); +JavaVersion JLS8() = javaVersion(8, "1.8"); +JavaVersion JLS9() = javaVersion(9, "9"); +JavaVersion JLS10() = javaVersion(10, "10"); +JavaVersion JLS11() = javaVersion(11, "11"); +JavaVersion JLS12() = javaVersion(12, "12"); +JavaVersion JLS13() = javaVersion(13, "13"); + data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) | \compilationUnit(Declaration package, list[Declaration] imports, list[Declaration] types) @@ -205,7 +222,7 @@ set[loc] findRoots(set[loc] folders) { @description{ Wrapper around ((createAstsFromFiles)) to call it on a single file. } -public Declaration createAstFromFile(loc file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7") { +public Declaration createAstFromFile(loc file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], JavaVersion javaVersion = JLS13()) { result = createAstsFromFiles({file}, collectBindings, errorRecovery = errorRecovery, sourcePath = sourcePath, classPath = classPath, javaVersion = javaVersion); if ({oneResult} := result) { return oneResult; @@ -219,11 +236,11 @@ public Declaration createAstFromFile(loc file, bool collectBindings, bool errorR Meaning, that it analyzes the whole file and not just the part that the positional information describes. } @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -public java set[Declaration] createAstsFromFiles(set[loc] file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7"); +public java set[Declaration] createAstsFromFiles(set[loc] file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], JavaVersion javaVersion = JLS13()); @synopsis{Creates AST from a string using Eclipse JDT compiler.} @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -public java Declaration createAstFromString(loc fileName, str source, bool collectBinding, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7"); +public java Declaration createAstFromString(loc fileName, str source, bool collectBinding, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], JavaVersion javaVersion = JLS13()); @synopsis{Creates a set ASTs for all Java source files in a project using Eclipse's JDT compiler} @description{ @@ -231,7 +248,7 @@ public java Declaration createAstFromString(loc fileName, str source, bool colle The function also looks for the dependencies (`.jar` files) to include them. Wraps around ((createAstsFromFiles)). } -public set[Declaration] createAstsFromDirectory(loc project, bool collectBindings, bool errorRecovery = false, str javaVersion = "1.7" ) { +public set[Declaration] createAstsFromDirectory(loc project, bool collectBindings, bool errorRecovery = false, JavaVersion javaVersion = JLS13() ) { if (!(isDirectory(project))) { throw " is not a valid directory"; } @@ -250,7 +267,7 @@ is expected to be at `project + "pom.xml"`. Wraps around ((createAstsFromFiles)). } -public set[Declaration] createAstsFromMavenProject(loc project, bool collectBindings, bool errorRecovery = false, str javaVersion = "1.7" ) { +public set[Declaration] createAstsFromMavenProject(loc project, bool collectBindings, bool errorRecovery = false, JavaVersion javaVersion = JLS13() ) { if (!exists(project + "pom.xml")) { throw IO("pom.xml not found"); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index 3eb7d7e019d..0ea3d9d61b1 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -32,6 +32,7 @@ import org.eclipse.jdt.core.dom.Comment; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.FileASTRequestor; +import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.rascalmpl.debug.IRascalMonitor; import org.rascalmpl.exceptions.RuntimeExceptionFactory; import org.rascalmpl.parser.gtd.io.InputConverter; @@ -39,6 +40,7 @@ import org.rascalmpl.uri.URIResolverRegistry; import io.usethesource.vallang.IBool; +import io.usethesource.vallang.IConstructor; import io.usethesource.vallang.IList; import io.usethesource.vallang.ISet; import io.usethesource.vallang.ISetWriter; @@ -89,11 +91,11 @@ protected IValue createM3FromJarFile(ISourceLocation jarLoc, IList classPath, Li return converter.getModel(false); } - public IValue createM3sFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion) { + public IValue createM3sFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion) { return createM3sFromFiles(files, errorRecovery, sourcePath, classPath, javaVersion, getM3Store(), () -> checkInterrupted(monitor)); } - protected IValue createM3sFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion, LimitedTypeStore store, Runnable interruptChecker) { + protected IValue createM3sFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store, Runnable interruptChecker) { try { Map cache = new HashMap<>(); ISetWriter result = VF.setWriter(); @@ -112,11 +114,11 @@ private void checkInterrupted(IRascalMonitor eval) { // throw new InterruptException("Java compiler interrupted", URIUtil.rootLocation("java")); // } } - public IValue createM3sAndAstsFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion) { + public IValue createM3sAndAstsFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion) { return createM3sAndAstsFromFiles(files, errorRecovery, sourcePath, classPath, javaVersion, getM3Store(), () -> checkInterrupted(monitor)); } - protected IValue createM3sAndAstsFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion, LimitedTypeStore store, Runnable interruptChecker) { + protected IValue createM3sAndAstsFromFiles(ISet files, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store, Runnable interruptChecker) { try { Map cache = new HashMap<>(); ISetWriter m3s = VF.setWriter(); @@ -133,12 +135,12 @@ protected IValue createM3sAndAstsFromFiles(ISet files, IBool errorRecovery, ILis } - public IValue createM3FromString(ISourceLocation loc, IString contents, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion) { + public IValue createM3FromString(ISourceLocation loc, IString contents, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion) { return createM3FromString(loc, contents, errorRecovery, sourcePath, classPath, javaVersion, getM3Store()); } - protected IValue createM3FromString(ISourceLocation loc, IString contents, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion, LimitedTypeStore store) { + protected IValue createM3FromString(ISourceLocation loc, IString contents, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store) { try { CompilationUnit cu = getCompilationUnit(loc.getPath(), contents.getValue().toCharArray(), true, errorRecovery.getValue(), javaVersion, translatePaths(sourcePath), translatePaths(classPath)); return convertToM3(store, new HashMap<>(), loc, cu); @@ -147,11 +149,11 @@ protected IValue createM3FromString(ISourceLocation loc, IString contents, IBool } } - public IValue createAstsFromFiles(ISet files, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion) { + public IValue createAstsFromFiles(ISet files, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion) { return createAstsFromFiles(files, collectBindings, errorRecovery, sourcePath, classPath, javaVersion, getM3Store(), () -> checkInterrupted(monitor)); } - protected IValue createAstsFromFiles(ISet files, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion, LimitedTypeStore store, Runnable interruptChecker) { + protected IValue createAstsFromFiles(ISet files, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store, Runnable interruptChecker) { try { Map cache = new HashMap<>(); ISetWriter result = VF.setWriter(); @@ -166,11 +168,11 @@ protected IValue createAstsFromFiles(ISet files, IBool collectBindings, IBool er } } - public IValue createAstFromString(ISourceLocation loc, IString contents, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion) { + public IValue createAstFromString(ISourceLocation loc, IString contents, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion) { return createAstFromString(loc, contents, collectBindings, errorRecovery, sourcePath, classPath, javaVersion, getM3Store()); } - protected IValue createAstFromString(ISourceLocation loc, IString contents, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IString javaVersion, LimitedTypeStore store) { + protected IValue createAstFromString(ISourceLocation loc, IString contents, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store) { try { CompilationUnit cu = getCompilationUnit(loc.getPath(), contents.getValue().toCharArray(), collectBindings.getValue(), errorRecovery.getValue(), javaVersion, translatePaths(sourcePath), translatePaths(classPath)); return convertToAST(collectBindings, new HashMap<>(), loc, cu, store); @@ -192,7 +194,7 @@ protected IValue convertToM3(LimitedTypeStore store, Map buildNotifier) throws IOException { + protected void buildCompilationUnits(ISet files, boolean resolveBindings, boolean errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, BiConsumer buildNotifier) throws IOException { boolean fastPath = true; for (IValue f : files) { fastPath &= safeResolve((ISourceLocation)f).getScheme().equals("file"); @@ -276,7 +278,7 @@ protected String guessEncoding(ISourceLocation loc) { } } - protected CompilationUnit getCompilationUnit(String unitName, char[] contents, boolean resolveBindings, boolean errorRecovery, IString javaVersion, String[] sourcePath, String[] classPath) + protected CompilationUnit getCompilationUnit(String unitName, char[] contents, boolean resolveBindings, boolean errorRecovery, IConstructor javaVersion, String[] sourcePath, String[] classPath) throws IOException { ASTParser parser = constructASTParser(resolveBindings, errorRecovery, javaVersion, sourcePath, classPath); parser.setUnitName(unitName); @@ -292,17 +294,17 @@ protected IValue convertToAST(IBool collectBindings, Map options = new Hashtable(); - options.put(JavaCore.COMPILER_SOURCE, javaVersion.getValue()); - options.put(JavaCore.COMPILER_COMPLIANCE, javaVersion.getValue()); + options.put(JavaCore.COMPILER_SOURCE, ((IString) javaVersion.get("version")).getValue()); + options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.get("version")).getValue()); + options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, ((IBool) javaVersion.get("preview")).toString()); options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED); parser.setCompilerOptions(options); From 98c57959fd29688f7f69125cb3d8572c93b919f6 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 16 Apr 2024 20:15:17 +0200 Subject: [PATCH 004/134] fixed switchCaseRule --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 2 +- .../library/lang/java/m3/internal/ASTConverter.java | 9 ++++++--- .../lang/java/m3/internal/EclipseJavaCompiler.java | 9 +++++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 1b664d12317..15c7fb08d51 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -121,7 +121,7 @@ data Statement | \return() | \switch(Expression expression, list[Statement] statements) | \case(list[Expression] expressions) - | \switchLabeledRule(list[Expression] expressions) + | \caseRule(list[Expression] expressions) | \defaultCase() | \synchronizedStatement(Expression lock, Statement body) | \throw(Expression expression) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 01a6ad22e72..7cccf8be26b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -983,13 +983,16 @@ public boolean visit(SwitchCase node) { .map(e -> visitChild(e)).collect(values.listWriter()); if (node.isSwitchLabeledRule()) { - constructorName = "switchLabeledRule"; + constructorName = "caseRule"; + ownValue = constructStatementNode(constructorName, exprs); } else if (node.isDefault()) { constructorName = "defaultCase"; + ownValue = constructStatementNode(constructorName); + } + else { + ownValue = constructStatementNode(constructorName, exprs); } - - ownValue = constructStatementNode(constructorName, exprs); return false; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index 0ea3d9d61b1..08b3f5c47e8 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -32,12 +32,12 @@ import org.eclipse.jdt.core.dom.Comment; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.FileASTRequestor; -import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.rascalmpl.debug.IRascalMonitor; import org.rascalmpl.exceptions.RuntimeExceptionFactory; import org.rascalmpl.parser.gtd.io.InputConverter; import org.rascalmpl.unicode.UnicodeDetector; import org.rascalmpl.uri.URIResolverRegistry; +import org.rascalmpl.values.IRascalValueFactory; import io.usethesource.vallang.IBool; import io.usethesource.vallang.IConstructor; @@ -300,11 +300,16 @@ protected ASTParser constructASTParser(boolean resolveBindings, boolean errorRec parser.setBindingsRecovery(true); parser.setStatementsRecovery(errorRecovery); + IBool previewParameter = (IBool) javaVersion.asWithKeywordParameters().getParameter("preview"); + if (previewParameter == null) { + previewParameter = IRascalValueFactory.getInstance().bool(true); + } + Hashtable options = new Hashtable(); options.put(JavaCore.COMPILER_SOURCE, ((IString) javaVersion.get("version")).getValue()); options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.get("version")).getValue()); - options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, ((IBool) javaVersion.get("preview")).toString()); + options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, previewParameter.getValue() ? JavaCore.ENABLED : JavaCore.DISABLED); options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED); parser.setCompilerOptions(options); From 7ebcb9cb24d3dccd6db3bf852a443044ddc43064 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 16 Apr 2024 20:24:50 +0200 Subject: [PATCH 005/134] added method reference expression --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 1 + .../library/lang/java/m3/internal/ASTConverter.java | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 15c7fb08d51..b76bb821635 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -94,6 +94,7 @@ data Expression | \simpleName(str name) | \switch(Expression expression, list[Statement] cases) | \markerAnnotation(str typeName) + | \methodReference(Type \type, list[Type] typeArguments, str name) | \normalAnnotation(str typeName, list[Expression] memberValuePairs) | \memberValuePair(str name, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 7cccf8be26b..621d2457187 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -6,6 +6,7 @@ import org.eclipse.jdt.core.dom.*; +import io.usethesource.vallang.IConstructor; import io.usethesource.vallang.IList; import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.ISourceLocation; @@ -999,8 +1000,11 @@ else if (node.isDefault()) { @Override public boolean visit(TypeMethodReference node) { - // TODO Auto-generated method stub - return super.visit(node); + IValue type = visitChild(node.getType()) + IList args = node.typeArguments().stream().map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); + IString name = values.string(node.getName().getIdentifier()); + + return constructExpressionNode("methodReference", type, args, name); } @Override From bff9a3def537d3c4ee34b446e6c6c73b0ddf9bb0 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 16 Apr 2024 20:27:33 +0200 Subject: [PATCH 006/134] added expression method reference --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 1 + .../library/lang/java/m3/internal/ASTConverter.java | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index b76bb821635..de710d6a45c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -95,6 +95,7 @@ data Expression | \switch(Expression expression, list[Statement] cases) | \markerAnnotation(str typeName) | \methodReference(Type \type, list[Type] typeArguments, str name) + | \methodReference(Expression expression, list[Type] typeArguments, str name) | \normalAnnotation(str typeName, list[Expression] memberValuePairs) | \memberValuePair(str name, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 621d2457187..bf801c0c027 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1009,8 +1009,11 @@ public boolean visit(TypeMethodReference node) { @Override public boolean visit(ExpressionMethodReference node) { - // TODO Auto-generated method stub - return super.visit(node); + IValue type = visitChild(node.getExpression()) + IList args = node.typeArguments().stream().map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); + IString name = values.string(node.getName().getIdentifier()); + + return constructExpressionNode("methodReference", type, args, name); } public boolean visit(SwitchStatement node) { From fd08a80c4abc353c0b6e7536423af51c4972b8ba Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 16 Apr 2024 20:31:11 +0200 Subject: [PATCH 007/134] added intersectiontype --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 1 + .../lang/java/m3/internal/ASTConverter.java | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index de710d6a45c..bdd8aa6588d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -144,6 +144,7 @@ data Type | qualifiedType(Type qualifier, Expression simpleName) | simpleType(Expression typeName) | unionType(list[Type] types) + | intersectionType(list[Type] types) | wildcard() | upperbound(Type \type) | lowerbound(Type \type) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index bf801c0c027..8262f00bb0b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1016,6 +1016,7 @@ public boolean visit(ExpressionMethodReference node) { return constructExpressionNode("methodReference", type, args, name); } + public boolean visit(SwitchStatement node) { IValue expression = visitChild(node.getExpression()); @@ -1180,6 +1181,7 @@ public boolean visit(TypeParameter node) { return false; } + @Override public boolean visit(UnionType node) { IValueList typesValues = new IValueList(values); @@ -1193,6 +1195,20 @@ public boolean visit(UnionType node) { return false; } + @Override + public boolean visit(IntersectionType node) { + + IValueList typesValues = new IValueList(values); + for(Iterator types = node.types().iterator(); types.hasNext();) { + Type type = (Type) types.next(); + typesValues.add(visitChild(type)); + } + + ownValue = constructTypeNode("intersectionType", typesValues.asList()); + + return false; + } + public boolean visit(VariableDeclarationExpression node) { IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); From 23020998f18ba969381c168a7aba806aecbc0487 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 17 Apr 2024 19:17:08 +0200 Subject: [PATCH 008/134] added missing @Override annotations to visit methods --- .../lang/java/m3/internal/ASTConverter.java | 112 ++++++++++++++++-- 1 file changed, 103 insertions(+), 9 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 8262f00bb0b..57d8d920695 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -24,6 +24,7 @@ public ASTConverter(final LimitedTypeStore typeStore, Map= AST.JLS3) { @@ -316,6 +337,7 @@ public boolean visit(ConstructorInvocation node) { return false; } + @Override public boolean visit(ContinueStatement node) { IValue label = node.getLabel() == null ? null : values.string(node.getLabel().getFullyQualifiedName()); @@ -324,6 +346,7 @@ public boolean visit(ContinueStatement node) { return false; } + @Override public boolean visit(DoStatement node) { IValue body = visitChild(node.getBody()); @@ -334,6 +357,7 @@ public boolean visit(DoStatement node) { return false; } + @Override public boolean visit(EmptyStatement node) { ownValue = constructStatementNode("empty"); @@ -341,6 +365,7 @@ public boolean visit(EmptyStatement node) { return false; } + @Override public boolean visit(EnhancedForStatement node) { IValue parameter = visitChild(node.getParameter()); @@ -352,6 +377,7 @@ public boolean visit(EnhancedForStatement node) { return false; } + @Override public boolean visit(EnumConstantDeclaration node) { IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -372,6 +398,7 @@ public boolean visit(EnumConstantDeclaration node) { return false; } + @Override public boolean visit(EnumDeclaration node) { IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -404,6 +431,7 @@ public boolean visit(EnumDeclaration node) { return false; } + @Override public boolean visit(ExpressionStatement node) { IValue expression = visitChild(node.getExpression()); @@ -412,6 +440,7 @@ public boolean visit(ExpressionStatement node) { return false; } + @Override public boolean visit(FieldAccess node) { IValue expression = visitChild(node.getExpression()); @@ -422,6 +451,7 @@ public boolean visit(FieldAccess node) { return false; } + @Override public boolean visit(FieldDeclaration node) { IValueList extendedModifiers = parseExtendedModifiers(node); @@ -438,6 +468,7 @@ public boolean visit(FieldDeclaration node) { return false; } + @Override public boolean visit(ForStatement node) { IValueList initializers = new IValueList(values); @@ -461,6 +492,7 @@ public boolean visit(ForStatement node) { return false; } + @Override public boolean visit(IfStatement node) { IValue booleanExpression = visitChild(node.getExpression()); @@ -472,6 +504,7 @@ public boolean visit(IfStatement node) { return false; } + @Override public boolean visit(ImportDeclaration node) { String name = node.getName().getFullyQualifiedName(); @@ -491,6 +524,7 @@ public boolean visit(ImportDeclaration node) { return false; } + @Override public boolean visit(InfixExpression node) { IValue operator = values.string(node.getOperator().toString()); @@ -508,6 +542,7 @@ public boolean visit(InfixExpression node) { return false; } + @Override public boolean visit(Initializer node) { IValueList extendedModifiers = parseExtendedModifiers(node); @@ -518,6 +553,7 @@ public boolean visit(Initializer node) { return false; } + @Override public boolean visit(InstanceofExpression node) { IValue leftSide = visitChild(node.getLeftOperand()); @@ -528,11 +564,13 @@ public boolean visit(InstanceofExpression node) { return false; } + @Override public boolean visit(Javadoc node) { return false; } + @Override public boolean visit(LabeledStatement node) { IValue label = values.string(node.getLabel().getFullyQualifiedName()); @@ -543,11 +581,13 @@ public boolean visit(LabeledStatement node) { return false; } + @Override public boolean visit(LineComment node) { return false; } + @Override public boolean visit(MarkerAnnotation node) { IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); @@ -556,10 +596,12 @@ public boolean visit(MarkerAnnotation node) { return false; } + @Override public boolean visit(MemberRef node) { return false; } + @Override public boolean visit(MemberValuePair node) { IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -570,6 +612,7 @@ public boolean visit(MemberValuePair node) { return false; } + @Override public boolean visit(MethodDeclaration node) { String constructorName = "method"; IValueList extendedModifiers = parseExtendedModifiers(node); @@ -639,6 +682,7 @@ public boolean visit(MethodDeclaration node) { return false; } + @Override public boolean visit(MethodInvocation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); @@ -666,14 +710,17 @@ public boolean visit(MethodInvocation node) { return false; } + @Override public boolean visit(MethodRef node) { return false; } + @Override public boolean visit(MethodRefParameter node) { return false; } + @Override public boolean visit(Modifier node) { String modifier = node.getKeyword().toString(); ownValue = constructModifierNode(modifier); @@ -681,6 +728,7 @@ public boolean visit(Modifier node) { return false; } + @Override public boolean visit(NormalAnnotation node) { IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); @@ -696,6 +744,7 @@ public boolean visit(NormalAnnotation node) { return false; } + @Override public boolean visit(NullLiteral node) { ownValue = constructExpressionNode("null"); @@ -703,6 +752,7 @@ public boolean visit(NullLiteral node) { return false; } + @Override public boolean visit(NumberLiteral node) { IValue number = values.string(node.getToken()); @@ -712,6 +762,7 @@ public boolean visit(NumberLiteral node) { return false; } + @Override public boolean visit(PackageDeclaration node) { IValueList annotations = new IValueList(values); @@ -731,6 +782,7 @@ public boolean visit(PackageDeclaration node) { return false; } + @Override public boolean visit(ParameterizedType node) { IValue type = visitChild(node.getType()); @@ -746,6 +798,7 @@ public boolean visit(ParameterizedType node) { return false; } + @Override public boolean visit(ParenthesizedExpression node) { IValue expression = visitChild(node.getExpression()); @@ -754,6 +807,7 @@ public boolean visit(ParenthesizedExpression node) { return false; } + @Override public boolean visit(PostfixExpression node) { IValue operand = visitChild(node.getOperand()); @@ -764,6 +818,7 @@ public boolean visit(PostfixExpression node) { return false; } + @Override public boolean visit(PrefixExpression node) { IValue operand = visitChild(node.getOperand()); @@ -774,12 +829,14 @@ public boolean visit(PrefixExpression node) { return false; } + @Override public boolean visit(PrimitiveType node) { ownValue = constructTypeNode(node.toString()); return false; } + @Override public boolean visit(QualifiedName node) { IValue qualifier = visitChild(node.getQualifier()); @@ -792,6 +849,7 @@ public boolean visit(QualifiedName node) { return false; } + @Override public boolean visit(QualifiedType node) { IValue qualifier = visitChild(node.getQualifier()); @@ -804,6 +862,7 @@ public boolean visit(QualifiedType node) { return false; } + @Override public boolean visit(ReturnStatement node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); @@ -812,6 +871,7 @@ public boolean visit(ReturnStatement node) { return false; } + @Override public boolean visit(SimpleName node) { IValue value = values.string(node.getFullyQualifiedName()); @@ -821,6 +881,7 @@ public boolean visit(SimpleName node) { return false; } + @Override public boolean visit(SimpleType node) { IValue value = visitChild(node.getName()); ownValue = constructTypeNode("simpleType", value); @@ -828,6 +889,7 @@ public boolean visit(SimpleType node) { return false; } + @Override public boolean visit(SingleMemberAnnotation node) { IValue name = values.string(node.getTypeName().getFullyQualifiedName()); @@ -838,6 +900,7 @@ public boolean visit(SingleMemberAnnotation node) { return false; } + @Override public boolean visit(SingleVariableDeclaration node) { IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -856,6 +919,7 @@ public boolean visit(SingleVariableDeclaration node) { return false; } + @Override public boolean visit(StringLiteral node) { IString escaped = values.string(node.getEscapedValue()); @@ -908,6 +972,7 @@ public boolean visit(SwitchExpression node) { return false; } + @Override public boolean visit(SuperConstructorInvocation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); @@ -933,6 +998,7 @@ public boolean visit(SuperConstructorInvocation node) { return false; } + @Override public boolean visit(SuperFieldAccess node) { IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); @@ -943,6 +1009,7 @@ public boolean visit(SuperFieldAccess node) { return false; } + @Override public boolean visit(SuperMethodInvocation node) { IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); @@ -970,7 +1037,7 @@ public boolean visit(SuperMethodInvocation node) { return false; } - + @Override public boolean visit(SwitchCase node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); List expressions = node.expressions(); @@ -1009,14 +1076,27 @@ public boolean visit(TypeMethodReference node) { @Override public boolean visit(ExpressionMethodReference node) { - IValue type = visitChild(node.getExpression()) - IList args = node.typeArguments().stream().map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); + IValue type = visitChild(node.getExpression()); + IList args = ((List) node.typeArguments()) + .stream() + .map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); IString name = values.string(node.getName().getIdentifier()); - return constructExpressionNode("methodReference", type, args, name); + ownValue = constructExpressionNode("methodReference", type, args, name); + return false; } - + @Override + public boolean visit(SuperMethodReference node) { + IList args = ((List) node.typeArguments()) + .stream().map(o -> (Type) o) + .map(t -> visitChild(t)).collect(values.listWriter()); + IString name = values.string(node.getName().getIdentifier()); + + ownValue = constructExpressionNode("superMethodReference", args, name); + return false; + } + @Override public boolean visit(SwitchStatement node) { IValue expression = visitChild(node.getExpression()); @@ -1032,6 +1112,7 @@ public boolean visit(SwitchStatement node) { return false; } + @Override public boolean visit(SynchronizedStatement node) { IValue expression = visitChild(node.getExpression()); @@ -1042,16 +1123,19 @@ public boolean visit(SynchronizedStatement node) { return false; } + @Override public boolean visit(TagElement node) { return false; } + @Override public boolean visit(TextElement node) { return false; } + @Override public boolean visit(ThisExpression node) { IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); @@ -1061,6 +1145,7 @@ public boolean visit(ThisExpression node) { return false; } + @Override public boolean visit(ThrowStatement node) { IValue expression = visitChild(node.getExpression()); @@ -1070,6 +1155,7 @@ public boolean visit(ThrowStatement node) { return false; } + @Override public boolean visit(TryStatement node) { IValue body = visitChild(node.getBody()); @@ -1087,6 +1173,7 @@ public boolean visit(TryStatement node) { return false; } + @Override public boolean visit(TypeDeclaration node) { IValueList extendedModifiers = parseExtendedModifiers(node); @@ -1140,6 +1227,7 @@ public boolean visit(TypeDeclaration node) { return false; } + @Override public boolean visit(TypeDeclarationStatement node) { IValue typeDeclaration; @@ -1155,6 +1243,7 @@ public boolean visit(TypeDeclarationStatement node) { return false; } + @Override public boolean visit(TypeLiteral node) { IValue type = visitChild(node.getType()); @@ -1164,6 +1253,7 @@ public boolean visit(TypeLiteral node) { return false; } + @Override public boolean visit(TypeParameter node) { IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -1209,6 +1299,7 @@ public boolean visit(IntersectionType node) { return false; } + @Override public boolean visit(VariableDeclarationExpression node) { IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -1231,6 +1322,7 @@ public boolean visit(VariableDeclarationExpression node) { return false; } + @Override public boolean visit(VariableDeclarationFragment node) { IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -1243,6 +1335,7 @@ public boolean visit(VariableDeclarationFragment node) { return false; } + @Override public boolean visit(VariableDeclarationStatement node) { IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -1264,8 +1357,8 @@ public boolean visit(VariableDeclarationStatement node) { return false; } + @Override public boolean visit(WhileStatement node) { - IValue expression = visitChild(node.getExpression()); IValue body = visitChild(node.getBody()); @@ -1274,6 +1367,7 @@ public boolean visit(WhileStatement node) { return false; } + @Override public boolean visit(WildcardType node) { //FIXME: upperbound/lowerbound that should have been type annotation are replaced by TypeSymbol IValue type = null; @@ -1283,8 +1377,8 @@ public boolean visit(WildcardType node) { type = visitChild(node.getBound()); if (node.isUpperBound()) { name = "upperbound"; - - } else { + } + else { name = "lowerbound"; } } From 575a5d35d77fe99a0803651eabe4ce2433610fe3 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 17 Apr 2024 19:17:52 +0200 Subject: [PATCH 009/134] added super.MethodReference to AST --- .../library/lang/java/examples/NewSwitch.java | 11 +++++++++++ src/org/rascalmpl/library/lang/java/m3/AST.rsc | 1 + .../library/lang/java/m3/internal/ASTConverter.java | 3 ++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 src/org/rascalmpl/library/lang/java/examples/NewSwitch.java diff --git a/src/org/rascalmpl/library/lang/java/examples/NewSwitch.java b/src/org/rascalmpl/library/lang/java/examples/NewSwitch.java new file mode 100644 index 00000000000..42d41d3d30d --- /dev/null +++ b/src/org/rascalmpl/library/lang/java/examples/NewSwitch.java @@ -0,0 +1,11 @@ +package org.rascalmpl.library.lang.java.examples; + +public class NewSwitch { + int testFunction(int i) { + return switch(i) { + case 0,1,2 -> 1; + case 3,4,5 -> 2; + default: yield 3; + }; + } +} diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index bdd8aa6588d..630af1039ca 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -96,6 +96,7 @@ data Expression | \markerAnnotation(str typeName) | \methodReference(Type \type, list[Type] typeArguments, str name) | \methodReference(Expression expression, list[Type] typeArguments, str name) + | \superMethodReference(list[Type] typeArguments, str name) | \normalAnnotation(str typeName, list[Expression] memberValuePairs) | \memberValuePair(str name, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 57d8d920695..ebc6e1c9cc0 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1096,7 +1096,8 @@ public boolean visit(SuperMethodReference node) { ownValue = constructExpressionNode("superMethodReference", args, name); return false; } - @Override + + @Override public boolean visit(SwitchStatement node) { IValue expression = visitChild(node.getExpression()); From ab8944b595f35d19630050d4598a914a6afda651 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 17 Apr 2024 19:22:18 +0200 Subject: [PATCH 010/134] minor --- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 4 ++-- .../library/lang/java/m3/internal/JavaToRascalConverter.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index ebc6e1c9cc0..91521925faf 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1126,13 +1126,13 @@ public boolean visit(SynchronizedStatement node) { @Override public boolean visit(TagElement node) { - + // TODO: what should be added here? return false; } @Override public boolean visit(TextElement node) { - + // TODO: what should happen here? return false; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index b75885b947c..6d9bc50bf97 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -193,7 +193,7 @@ protected IValueList parseModifiers(int modifiers) { } @SuppressWarnings({"rawtypes"}) - protected IValueList parseExtendedModifiers(List ext) { + protected IValueList parseExtendedModifiers(List ext) { IValueList extendedModifierList = new IValueList(values); for (Iterator it = ext.iterator(); it.hasNext();) { @@ -207,7 +207,6 @@ protected IValueList parseExtendedModifiers(List ext) { return extendedModifierList; } - @SuppressWarnings("deprecation") protected IValueList parseExtendedModifiers(BodyDeclaration node) { if (node.getAST().apiLevel() == AST.JLS2) { return parseModifiers(node.getModifiers()); From c74ebb6bdfa166fad44ee9f290fb3949386410f0 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 17 Apr 2024 19:35:52 +0200 Subject: [PATCH 011/134] refactored IValueList usages to IListWriter and removed IValueList --- .../lang/java/m3/internal/ASTConverter.java | 256 +++++++++--------- .../lang/java/m3/internal/IValueList.java | 66 ----- .../m3/internal/JavaToRascalConverter.java | 45 ++- .../lang/java/m3/internal/M3Converter.java | 4 +- .../java/m3/internal/SourceConverter.java | 29 +- 5 files changed, 165 insertions(+), 235 deletions(-) delete mode 100644 src/org/rascalmpl/library/lang/java/m3/internal/IValueList.java diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 91521925faf..73fedd7f0dd 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -6,14 +6,13 @@ import org.eclipse.jdt.core.dom.*; -import io.usethesource.vallang.IConstructor; import io.usethesource.vallang.IList; import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; -@SuppressWarnings({"rawtypes", "deprecation"}) +@SuppressWarnings({"rawtypes"}) public class ASTConverter extends JavaToRascalConverter { /* * TODO: @@ -75,23 +74,23 @@ else if (node instanceof VariableDeclaration) { @Override public boolean visit(AnnotationTypeDeclaration node) { - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList bodyDeclarations = new IValueList(values); + IListWriter bodyDeclarations = values.listWriter(); for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration d = (BodyDeclaration) it.next(); - bodyDeclarations.add(visitChild(d)); + bodyDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode("annotationType", name, bodyDeclarations.asList()); + ownValue = constructDeclarationNode("annotationType", name, bodyDeclarations.done()); setKeywordParameters("modifiers", extendedModifiers); return false; } @Override public boolean visit(AnnotationTypeMemberDeclaration node) { - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue typeArgument = visitChild(node.getType()); String name = node.getName().getFullyQualifiedName(); @@ -104,13 +103,13 @@ public boolean visit(AnnotationTypeMemberDeclaration node) { @Override public boolean visit(AnonymousClassDeclaration node) { - IValueList bodyDeclarations = new IValueList(values); + IListWriter bodyDeclarations = values.listWriter(); for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration b = (BodyDeclaration) it.next(); - bodyDeclarations.add(visitChild(b)); + bodyDeclarations.append(visitChild(b)); } - ownValue = constructDeclarationNode("class", bodyDeclarations.asList()); + ownValue = constructDeclarationNode("class", bodyDeclarations.done()); return false; } @@ -129,28 +128,28 @@ public boolean visit(ArrayAccess node) { public boolean visit(ArrayCreation node) { IValue type = visitChild(node.getType().getElementType()); - IValueList dimensions = new IValueList(values); + IListWriter dimensions = values.listWriter(); for (Iterator it = node.dimensions().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - dimensions.add(visitChild(e)); + dimensions.append(visitChild(e)); } IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); - ownValue = constructExpressionNode("newArray", type, dimensions.asList(), initializer); + ownValue = constructExpressionNode("newArray", type, dimensions.done(), initializer); return false; } @Override public boolean visit(ArrayInitializer node) { - IValueList expressions = new IValueList(values); + IListWriter expressions = values.listWriter(); for (Iterator it = node.expressions().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - expressions.add(visitChild(e)); + expressions.append(visitChild(e)); } - ownValue = constructExpressionNode("arrayInitializer", expressions.asList()); + ownValue = constructExpressionNode("arrayInitializer", expressions.done()); return false; } @@ -186,13 +185,13 @@ public boolean visit(Assignment node) { @Override public boolean visit(Block node) { - IValueList statements = new IValueList(values); + IListWriter statements = values.listWriter(); for (Iterator it = node.statements().iterator(); it.hasNext();) { Statement s = (Statement) it.next(); - statements.add(visitChild(s)); + statements.append(visitChild(s)); } - ownValue = constructStatementNode("block", statements.asList()); + ownValue = constructStatementNode("block", statements.done()); return false; } @@ -253,7 +252,7 @@ public boolean visit(ClassInstanceCreation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); IValue type = null; - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() == AST.JLS2) { type = visitChild(node.getName()); } @@ -263,20 +262,20 @@ public boolean visit(ClassInstanceCreation node) { if (!node.typeArguments().isEmpty()) { for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } } } - IValueList arguments = new IValueList(values); + IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - arguments.add(visitChild(e)); + arguments.append(visitChild(e)); } IValue anonymousClassDeclaration = node.getAnonymousClassDeclaration() == null ? null : visitChild(node.getAnonymousClassDeclaration()); - ownValue = constructExpressionNode("newObject", expression, type, arguments.asList(), anonymousClassDeclaration); + ownValue = constructExpressionNode("newObject", expression, type, arguments.done(), anonymousClassDeclaration); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -285,19 +284,19 @@ public boolean visit(ClassInstanceCreation node) { public boolean visit(CompilationUnit node) { IValue packageOfUnit = node.getPackage() == null ? null : visitChild(node.getPackage()); - IValueList imports = new IValueList(values); + IListWriter imports = values.listWriter(); for (Iterator it = node.imports().iterator(); it.hasNext();) { ImportDeclaration d = (ImportDeclaration) it.next(); - imports.add(visitChild(d)); + imports.append(visitChild(d)); } - IValueList typeDeclarations = new IValueList(values); + IListWriter typeDeclarations = values.listWriter(); for (Iterator it = node.types().iterator(); it.hasNext();) { AbstractTypeDeclaration d = (AbstractTypeDeclaration) it.next(); - typeDeclarations.add(visitChild(d)); + typeDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode("compilationUnit", packageOfUnit, imports.asList(), typeDeclarations.asList()); + ownValue = constructDeclarationNode("compilationUnit", packageOfUnit, imports.done(), typeDeclarations.done()); return false; } @@ -314,24 +313,24 @@ public boolean visit(ConditionalExpression node) { @Override public boolean visit(ConstructorInvocation node) { - IValueList types = new IValueList(values); + IListWriter types = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); - types.add(visitChild(t)); + types.append(visitChild(t)); } } } - IValueList arguments = new IValueList(values); + IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - arguments.add(visitChild(e)); + arguments.append(visitChild(e)); } - ownValue = constructStatementNode("constructorCall", values.bool(false), arguments.asList()); + ownValue = constructStatementNode("constructorCall", values.bool(false), arguments.done()); //setKeywordParameters("typeParameters", types); return false; @@ -380,20 +379,20 @@ public boolean visit(EnhancedForStatement node) { @Override public boolean visit(EnumConstantDeclaration node) { - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList arguments = new IValueList(values); + IListWriter arguments = values.listWriter(); if (!node.arguments().isEmpty()) { for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - arguments.add(visitChild(e)); + arguments.append(visitChild(e)); } } IValue anonymousClassDeclaration = node.getAnonymousClassDeclaration() == null ? null : visitChild(node.getAnonymousClassDeclaration()); - ownValue = constructDeclarationNode("enumConstant", name, arguments.asList(), anonymousClassDeclaration); + ownValue = constructDeclarationNode("enumConstant", name, arguments.done(), anonymousClassDeclaration); setKeywordParameters("modifiers", extendedModifiers); return false; } @@ -401,32 +400,32 @@ public boolean visit(EnumConstantDeclaration node) { @Override public boolean visit(EnumDeclaration node) { - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList implementedInterfaces = new IValueList(values); + IListWriter implementedInterfaces = values.listWriter(); if (!node.superInterfaceTypes().isEmpty()) { for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { Type t = (Type) it.next(); - implementedInterfaces.add(visitChild(t)); + implementedInterfaces.append(visitChild(t)); } } - IValueList enumConstants = new IValueList(values); + IListWriter enumConstants = values.listWriter(); for (Iterator it = node.enumConstants().iterator(); it.hasNext();) { EnumConstantDeclaration d = (EnumConstantDeclaration) it.next(); - enumConstants.add(visitChild(d)); + enumConstants.append(visitChild(d)); } - IValueList bodyDeclarations = new IValueList(values); + IListWriter bodyDeclarations = values.listWriter(); if (!node.bodyDeclarations().isEmpty()) { for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration d = (BodyDeclaration) it.next(); - bodyDeclarations.add(visitChild(d)); + bodyDeclarations.append(visitChild(d)); } } - ownValue = constructDeclarationNode("enum", name, implementedInterfaces.asList(), enumConstants.asList(), bodyDeclarations.asList()); + ownValue = constructDeclarationNode("enum", name, implementedInterfaces.done(), enumConstants.done(), bodyDeclarations.done()); setKeywordParameters("modifiers", extendedModifiers); return false; } @@ -454,16 +453,16 @@ public boolean visit(FieldAccess node) { @Override public boolean visit(FieldDeclaration node) { - IValueList extendedModifiers = parseExtendedModifiers(node); + IList extendedModifiers = parseExtendedModifiers(node); IValue type = visitChild(node.getType()); - IValueList fragments = new IValueList(values); + IListWriter fragments = values.listWriter(); for (Iterator it = node.fragments().iterator(); it.hasNext();) { VariableDeclarationFragment f = (VariableDeclarationFragment) it.next(); - fragments.add(visitChild(f)); + fragments.append(visitChild(f)); } - ownValue = constructDeclarationNode("field", type, fragments.asList()); + ownValue = constructDeclarationNode("field", type, fragments.done()); setKeywordParameters("modifiers", extendedModifiers); return false; } @@ -471,23 +470,23 @@ public boolean visit(FieldDeclaration node) { @Override public boolean visit(ForStatement node) { - IValueList initializers = new IValueList(values); + IListWriter initializers = values.listWriter(); for (Iterator it = node.initializers().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - initializers.add(visitChild(e)); + initializers.append(visitChild(e)); } IValue booleanExpression = node.getExpression() == null ? null : visitChild(node.getExpression()); - IValueList updaters = new IValueList(values); + IListWriter updaters = values.listWriter(); for (Iterator it = node.updaters().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - updaters.add(visitChild(e)); + updaters.append(visitChild(e)); } IValue body = visitChild(node.getBody()); - ownValue = constructStatementNode("for", initializers.asList(), booleanExpression, updaters.asList(), body); + ownValue = constructStatementNode("for", initializers.done(), booleanExpression, updaters.done(), body); return false; } @@ -509,17 +508,17 @@ public boolean visit(ImportDeclaration node) { String name = node.getName().getFullyQualifiedName(); - IValueList importModifiers = new IValueList(values); + IListWriter importModifiers = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (node.isStatic()) - importModifiers.add(constructModifierNode("static")); + importModifiers.append(constructModifierNode("static")); if (node.isOnDemand()) - importModifiers.add(constructModifierNode("onDemand")); + importModifiers.append(constructModifierNode("onDemand")); } ownValue = constructDeclarationNode("import", values.string(name)); - setKeywordParameters("modifiers", importModifiers); + setKeywordParameters("modifiers", importModifiers.done()); return false; } @@ -545,7 +544,7 @@ public boolean visit(InfixExpression node) { @Override public boolean visit(Initializer node) { - IValueList extendedModifiers = parseExtendedModifiers(node); + IList extendedModifiers = parseExtendedModifiers(node); IValue body = visitChild(node.getBody()); ownValue = constructDeclarationNode("initializer", body); @@ -615,14 +614,14 @@ public boolean visit(MemberValuePair node) { @Override public boolean visit(MethodDeclaration node) { String constructorName = "method"; - IValueList extendedModifiers = parseExtendedModifiers(node); + IList extendedModifiers = parseExtendedModifiers(node); - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeParameters().isEmpty()) { for (Iterator it = node.typeParameters().iterator(); it.hasNext();) { TypeParameter t = (TypeParameter) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } } } @@ -687,25 +686,25 @@ public boolean visit(MethodInvocation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } } } IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList arguments = new IValueList(values); + IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - arguments.add(visitChild(e)); + arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("methodCall", values.bool(false), expression, name, arguments.asList()); + ownValue = constructExpressionNode("methodCall", values.bool(false), expression, name, arguments.done()); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -733,13 +732,13 @@ public boolean visit(NormalAnnotation node) { IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); - IValueList memberValuePairs = new IValueList(values); + IListWriter memberValuePairs = values.listWriter(); for (Iterator it = node.values().iterator(); it.hasNext();) { MemberValuePair p = (MemberValuePair) it.next(); - memberValuePairs.add(visitChild(p)); + memberValuePairs.append(visitChild(p)); } - ownValue = constructExpressionNode("normalAnnotation", typeName, memberValuePairs.asList()); + ownValue = constructExpressionNode("normalAnnotation", typeName, memberValuePairs.done()); return false; } @@ -764,9 +763,7 @@ public boolean visit(NumberLiteral node) { @Override public boolean visit(PackageDeclaration node) { - IValueList annotations = new IValueList(values); - - annotations = parseExtendedModifiers(node.annotations()); + IList annotations = parseExtendedModifiers(node.annotations()); ownValue = null; for (String component: node.getName().getFullyQualifiedName().split("\\.")) { @@ -787,10 +784,10 @@ public boolean visit(ParameterizedType node) { IValue type = visitChild(node.getType()); - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } ownValue = constructTypeNode("parameterizedType", type); @@ -905,7 +902,7 @@ public boolean visit(SingleVariableDeclaration node) { IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue type = visitChild(node.getType()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); @@ -961,13 +958,13 @@ public boolean visit(LambdaExpression node) { public boolean visit(SwitchExpression node) { IValue expression = visitChild(node.getExpression()); - IValueList statements = new IValueList(values); + IListWriter statements = values.listWriter(); for (Iterator it = node.statements().iterator(); it.hasNext();) { Statement s = (Statement) it.next(); - statements.add(visitChild(s)); + statements.append(visitChild(s)); } - ownValue = constructExpressionNode("switch", expression, statements.asList()); + ownValue = constructExpressionNode("switch", expression, statements.done()); return false; } @@ -977,23 +974,23 @@ public boolean visit(SuperConstructorInvocation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } } } - IValueList arguments = new IValueList(values); + IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - arguments.add(visitChild(e)); + arguments.append(visitChild(e)); } - ownValue = constructStatementNode("constructorCall", values.bool(true), expression, arguments.asList()); + ownValue = constructStatementNode("constructorCall", values.bool(true), expression, arguments.done()); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -1014,25 +1011,25 @@ public boolean visit(SuperMethodInvocation node) { IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } } } IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList arguments = new IValueList(values); + IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); - arguments.add(visitChild(e)); + arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("methodCall", values.bool(true), qualifier, name, arguments.asList()); + ownValue = constructExpressionNode("methodCall", values.bool(true), qualifier, name, arguments.done()); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -1067,11 +1064,14 @@ else if (node.isDefault()) { @Override public boolean visit(TypeMethodReference node) { - IValue type = visitChild(node.getType()) - IList args = node.typeArguments().stream().map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); + IValue type = visitChild(node.getType()); + IList args = ((List) node.typeArguments()) + .stream() + .map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); IString name = values.string(node.getName().getIdentifier()); - return constructExpressionNode("methodReference", type, args, name); + ownValue = constructExpressionNode("methodReference", type, args, name); + return false; } @Override @@ -1102,13 +1102,13 @@ public boolean visit(SwitchStatement node) { IValue expression = visitChild(node.getExpression()); - IValueList statements = new IValueList(values); + IListWriter statements = values.listWriter(); for (Iterator it = node.statements().iterator(); it.hasNext();) { Statement s = (Statement) it.next(); - statements.add(visitChild(s)); + statements.append(visitChild(s)); } - ownValue = constructStatementNode("switch", expression, statements.asList()); + ownValue = constructStatementNode("switch", expression, statements.done()); return false; } @@ -1161,15 +1161,15 @@ public boolean visit(TryStatement node) { IValue body = visitChild(node.getBody()); - IValueList catchClauses = new IValueList(values); + IListWriter catchClauses = values.listWriter(); for (Iterator it = node.catchClauses().iterator(); it.hasNext();) { CatchClause cc = (CatchClause) it.next(); - catchClauses.add(visitChild(cc)); + catchClauses.append(visitChild(cc)); } IValue finallyBlock = node.getFinally() == null ? null : visitChild(node.getFinally()); - ownValue = constructStatementNode("try", body, catchClauses.asList(), finallyBlock); + ownValue = constructStatementNode("try", body, catchClauses.done(), finallyBlock); return false; } @@ -1177,52 +1177,52 @@ public boolean visit(TryStatement node) { @Override public boolean visit(TypeDeclaration node) { - IValueList extendedModifiers = parseExtendedModifiers(node); + IList extendedModifiers = parseExtendedModifiers(node); String objectType = node.isInterface() ? "interface" : "class"; IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList genericTypes = new IValueList(values); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeParameters().isEmpty()) { for (Iterator it = node.typeParameters().iterator(); it.hasNext();) { TypeParameter t = (TypeParameter) it.next(); - genericTypes.add(visitChild(t)); + genericTypes.append(visitChild(t)); } } } - IValueList extendsClass = new IValueList(values); - IValueList implementsInterfaces = new IValueList(values); + IListWriter extendsClass = values.listWriter(); + IListWriter implementsInterfaces = values.listWriter(); if (node.getAST().apiLevel() == AST.JLS2) { if (node.getSuperclass() != null) { - extendsClass.add(visitChild(node.getSuperclass())); + extendsClass.append(visitChild(node.getSuperclass())); } if (!node.superInterfaces().isEmpty()) { for (Iterator it = node.superInterfaces().iterator(); it.hasNext();) { Name n = (Name) it.next(); - implementsInterfaces.add(visitChild(n)); + implementsInterfaces.append(visitChild(n)); } } } else if (node.getAST().apiLevel() >= AST.JLS3) { if (node.getSuperclassType() != null) { - extendsClass.add(visitChild(node.getSuperclassType())); + extendsClass.append(visitChild(node.getSuperclassType())); } if (!node.superInterfaceTypes().isEmpty()) { for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { Type t = (Type) it.next(); - implementsInterfaces.add(visitChild(t)); + implementsInterfaces.append(visitChild(t)); } } } - IValueList bodyDeclarations = new IValueList(values); + IListWriter bodyDeclarations = values.listWriter(); for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration d = (BodyDeclaration) it.next(); - bodyDeclarations.add(visitChild(d)); + bodyDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode(objectType, name, extendsClass.asList(), implementsInterfaces.asList(), bodyDeclarations.asList()); + ownValue = constructDeclarationNode(objectType, name, extendsClass.done(), implementsInterfaces.done(), bodyDeclarations.done()); setKeywordParameters("modifiers", extendedModifiers); //setKeywordParameters("typeParameters", genericTypes); return false; @@ -1259,15 +1259,15 @@ public boolean visit(TypeParameter node) { IValue name = values.string(node.getName().getFullyQualifiedName()); - IValueList extendsList = new IValueList(values); + IListWriter extendsList = values.listWriter(); if (!node.typeBounds().isEmpty()) { for (Iterator it = node.typeBounds().iterator(); it.hasNext();) { Type t = (Type) it.next(); - extendsList.add(visitChild(t)); + extendsList.append(visitChild(t)); } } - ownValue = constructDeclarationNode("typeParameter", name, extendsList.asList()); + ownValue = constructDeclarationNode("typeParameter", name, extendsList.done()); return false; } @@ -1275,13 +1275,13 @@ public boolean visit(TypeParameter node) { @Override public boolean visit(UnionType node) { - IValueList typesValues = new IValueList(values); + IListWriter typesValues = values.listWriter(); for(Iterator types = node.types().iterator(); types.hasNext();) { Type type = (Type) types.next(); - typesValues.add(visitChild(type)); + typesValues.append(visitChild(type)); } - ownValue = constructTypeNode("unionType", typesValues.asList()); + ownValue = constructTypeNode("unionType", typesValues.done()); return false; } @@ -1289,13 +1289,13 @@ public boolean visit(UnionType node) { @Override public boolean visit(IntersectionType node) { - IValueList typesValues = new IValueList(values); + IListWriter typesValues = values.listWriter(); for(Iterator types = node.types().iterator(); types.hasNext();) { Type type = (Type) types.next(); - typesValues.add(visitChild(type)); + typesValues.append(visitChild(type)); } - ownValue = constructTypeNode("intersectionType", typesValues.asList()); + ownValue = constructTypeNode("intersectionType", typesValues.done()); return false; } @@ -1303,18 +1303,18 @@ public boolean visit(IntersectionType node) { @Override public boolean visit(VariableDeclarationExpression node) { - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue type = visitChild(node.getType()); - IValueList fragments = new IValueList(values); + IListWriter fragments = values.listWriter(); for (Iterator it = node.fragments().iterator(); it.hasNext();) { VariableDeclarationFragment f = (VariableDeclarationFragment) it.next(); - fragments.add(visitChild(f)); + fragments.append(visitChild(f)); } - ownValue = constructDeclarationNode("variables", type, fragments.asList()); + ownValue = constructDeclarationNode("variables", type, fragments.done()); setKeywordParameters("modifiers", extendedModifiers); ownValue = constructExpressionNode("declarationExpression", ownValue); @@ -1339,18 +1339,18 @@ public boolean visit(VariableDeclarationFragment node) { @Override public boolean visit(VariableDeclarationStatement node) { - IValueList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue type = visitChild(node.getType()); - IValueList fragments = new IValueList(values); + IListWriter fragments = values.listWriter(); for (Iterator it = node.fragments().iterator(); it.hasNext();) { VariableDeclarationFragment f = (VariableDeclarationFragment) it.next(); - fragments.add(visitChild(f)); + fragments.append(visitChild(f)); } - ownValue = constructDeclarationNode("variables", type, fragments.asList()); + ownValue = constructDeclarationNode("variables", type, fragments.done()); setKeywordParameters("modifiers", extendedModifiers); ownValue = constructStatementNode("declarationStatement", ownValue); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/IValueList.java b/src/org/rascalmpl/library/lang/java/m3/internal/IValueList.java deleted file mode 100644 index 62e95bb01a0..00000000000 --- a/src/org/rascalmpl/library/lang/java/m3/internal/IValueList.java +++ /dev/null @@ -1,66 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2009-2011 CWI - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * * Jouke Stoel - Jouke.Stoel@cwi.nl (CWI) -*******************************************************************************/ -package org.rascalmpl.library.lang.java.m3.internal; - -import java.util.ArrayList; -import java.util.List; - -import io.usethesource.vallang.IValue; -import io.usethesource.vallang.IValueFactory; - -public class IValueList { - private final IValueFactory values; - - private List valueList; - - public IValueList(final IValueFactory values) { - this.values = values; - - valueList = new ArrayList(); - } - - public void add(IValue value) { - valueList.add(value); - } - - private IValue[] toArray() { - return valueList.toArray(new IValue[0]); - } - - public IValue asList() { - return values.list(toArray()); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((valueList == null) ? 0 : valueList.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - IValueList other = (IValueList) obj; - if (valueList == null) { - if (other.valueList != null) - return false; - } else if (!valueList.equals(other.valueList)) - return false; - return true; - } -} diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 6d9bc50bf97..f569a6b32f6 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -1,7 +1,7 @@ package org.rascalmpl.library.lang.java.m3.internal; import java.net.URISyntaxException; -import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -169,32 +169,28 @@ protected ISourceLocation getSourceLocation(ASTNode node) { } protected IValue[] removeNulls(IValue... withNulls) { - List withOutNulls = new ArrayList(); - for (IValue child : withNulls) { - if (!(child == null)) { - withOutNulls.add(child); - } - } - return withOutNulls.toArray(new IValue[withOutNulls.size()]); + return Arrays.stream(withNulls) + .filter(e -> e != null) + .toArray(IValue[]::new); } - protected IValueList parseModifiers(int modifiers) { - IValueList extendedModifierList = new IValueList(values); + protected IList parseModifiers(int modifiers) { + IListWriter extendedModifierList = values.listWriter(); for (String constructor: java.lang.reflect.Modifier.toString(modifiers).split(" ")) { Set exConstr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE, constructor); for (io.usethesource.vallang.type.Type con: exConstr) { - extendedModifierList.add(values.constructor(con)); + extendedModifierList.append(values.constructor(con)); } } - return extendedModifierList; + return extendedModifierList.done(); } @SuppressWarnings({"rawtypes"}) - protected IValueList parseExtendedModifiers(List ext) { - IValueList extendedModifierList = new IValueList(values); + protected IList parseExtendedModifiers(List ext) { + IListWriter extendedModifierList = values.listWriter(); for (Iterator it = ext.iterator(); it.hasNext();) { ASTNode p = (ASTNode) it.next(); @@ -202,12 +198,12 @@ protected IValueList parseExtendedModifiers(List ext) { if (p instanceof Annotation) { val = constructModifierNode("annotation", val); } - extendedModifierList.add(val); + extendedModifierList.append(val); } - return extendedModifierList; + return extendedModifierList.done(); } - protected IValueList parseExtendedModifiers(BodyDeclaration node) { + protected IList parseExtendedModifiers(BodyDeclaration node) { if (node.getAST().apiLevel() == AST.JLS2) { return parseModifiers(node.getModifiers()); } else { @@ -239,12 +235,11 @@ protected void setKeywordParameter(String label, IValue value) { } } - protected void setKeywordParameters(String label, IValueList valueList) { - IList values = (IList) valueList.asList(); - if(this.ownValue == null) { + protected void setKeywordParameters(String label, IList values) { + if (this.ownValue == null) { return ; } - if (valueList != null && !values.isEmpty()) { + if (values != null && !values.isEmpty()) { this.ownValue = ((IConstructor) this.ownValue).asWithKeywordParameters().setParameter(label, values); } } @@ -284,11 +279,11 @@ protected Type getAdtType() { protected void insertCompilationUnitMessages(boolean insertErrors, IList otherMessages) { io.usethesource.vallang.type.Type args = TF.tupleType(TF.stringType(), TF.sourceLocationType()); - IValueList result = new IValueList(values); + IListWriter result = values.listWriter(); if (otherMessages != null) { for (IValue message : otherMessages) { - result.add(message); + result.append(message); } } @@ -307,10 +302,10 @@ protected void insertCompilationUnitMessages(boolean insertErrors, IList otherMe } else { constr = typeStore.lookupConstructor(this.typeStore.lookupAbstractDataType("Message"), "warning", args); } - result.add(values.constructor(constr, values.string(problems[i].getMessage()), pos)); + result.append(values.constructor(constr, values.string(problems[i].getMessage()), pos)); } } - setKeywordParameter("messages", result.asList()); + setKeywordParameter("messages", result.done()); } public void insert(IListWriter listW, IValue message) { diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index b441b601f6e..1dd27ba1064 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -83,8 +83,8 @@ public void insert(ISetWriter relW, IValue lhs, IValue rhs) { } } - public void insert(ISetWriter relW, IValue lhs, IValueList rhs) { - for (IValue oneRHS: (IList)rhs.asList()) { + public void insert(ISetWriter relW, IValue lhs, IList rhs) { + for (IValue oneRHS: rhs) { if (lhs.getType().isString() || (isValid((ISourceLocation) lhs) && isValid((ISourceLocation) oneRHS))) { insert(relW, lhs, oneRHS); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java index fbd4beeff4b..80973690eda 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java @@ -49,6 +49,7 @@ import org.rascalmpl.uri.URIUtil; import io.usethesource.vallang.IConstructor; +import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.ISourceLocation; @SuppressWarnings("rawtypes") @@ -193,14 +194,14 @@ public void endVisit(EnumConstantDeclaration node) { public boolean visit(EnumDeclaration node) { insert(containment, getParent(), ownValue); - IValueList implementedInterfaces = new IValueList(values); + IListWriter implementedInterfaces = values.listWriter(); if (!node.superInterfaceTypes().isEmpty()) { for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { Type t = (Type) it.next(); - implementedInterfaces.add(resolveBinding(t)); + implementedInterfaces.append(resolveBinding(t)); } } - insert(implementsRelations, ownValue, implementedInterfaces); + insert(implementsRelations, ownValue, implementedInterfaces.done()); scopeManager.push((ISourceLocation) ownValue); return true; @@ -424,37 +425,37 @@ public boolean visit(TypeDeclaration node) { scopeManager.push((ISourceLocation) ownValue); - IValueList extendsClass = new IValueList(values); - IValueList implementsInterfaces = new IValueList(values); + IListWriter extendsClass = values.listWriter(); + IListWriter implementsInterfaces = values.listWriter(); if (node.getAST().apiLevel() == AST.JLS2) { if (node.getSuperclass() != null) { - extendsClass.add(resolveBinding(node.getSuperclass())); + extendsClass.append(resolveBinding(node.getSuperclass())); } if (!node.superInterfaces().isEmpty()) { for (Iterator it = node.superInterfaces().iterator(); it.hasNext();) { Name n = (Name) it.next(); - implementsInterfaces.add(resolveBinding(n)); + implementsInterfaces.append(resolveBinding(n)); } } } else if (node.getAST().apiLevel() >= AST.JLS3) { if (node.getSuperclassType() != null) { - extendsClass.add(resolveBinding(node.getSuperclassType())); + extendsClass.append(resolveBinding(node.getSuperclassType())); } if (!node.superInterfaceTypes().isEmpty()) { for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { Type t = (Type) it.next(); - implementsInterfaces.add(resolveBinding(t)); + implementsInterfaces.append(resolveBinding(t)); } } } if (node.isInterface()) { - insert(extendsRelations, ownValue, implementsInterfaces); + insert(extendsRelations, ownValue, implementsInterfaces.done()); } else { - insert(extendsRelations, ownValue, extendsClass); - insert(implementsRelations, ownValue, implementsInterfaces); + insert(extendsRelations, ownValue, extendsClass.done()); + insert(implementsRelations, ownValue, implementsInterfaces.done()); } return true; @@ -467,11 +468,11 @@ public void endVisit(TypeDeclaration node) { } public boolean visit(TypeParameter node) { - IValueList extendsList = new IValueList(values); + IListWriter extendsList = values.listWriter(); if (!node.typeBounds().isEmpty()) { for (Iterator it = node.typeBounds().iterator(); it.hasNext();) { Type t = (Type) it.next(); - extendsList.add(resolveBinding(t)); + extendsList.append(resolveBinding(t)); } } From 8225b239d76793f33075e0f50abbe17d100b961e Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 17 Apr 2024 20:21:20 +0200 Subject: [PATCH 012/134] added initial implementation of the AST nodes for the Java module system, in particular the AST nodes that may occur in module-info.java files. Still to be tested --- .../rascalmpl/library/lang/java/m3/AST.rsc | 11 +++ .../lang/java/m3/internal/ASTConverter.java | 84 ++++++++++++++++++- 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 630af1039ca..427823b9669 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -55,6 +55,15 @@ data Declaration | \vararg(Type \type, str name) ; +@synopsis{These declarations types are related to the Java 9 module system} +data Declaration + = \module(list[Modifier] open, str name, list[Declaration] directives) + | \opensPackage(str name, list[Expression] modules) + | \providesImplementations(str name, list[Expression] implementations) + | \requires(list[Modifier] modifiers, list[Expression] modules) + | \uses(Expression interface) + ; + data Expression = \arrayAccess(Expression array, Expression index) @@ -177,6 +186,8 @@ data Modifier | \annotation(Expression \anno) | \onDemand() | \default() + | \open() // for modules only + | \transitive() // for module requirements only ; @memo diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 73fedd7f0dd..a5cf07e8227 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -72,6 +72,7 @@ else if (node instanceof VariableDeclaration) { return null; } + @Override public boolean visit(AnnotationTypeDeclaration node) { IList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -505,7 +506,6 @@ public boolean visit(IfStatement node) { @Override public boolean visit(ImportDeclaration node) { - String name = node.getName().getFullyQualifiedName(); IListWriter importModifiers = values.listWriter(); @@ -848,7 +848,6 @@ public boolean visit(QualifiedName node) { @Override public boolean visit(QualifiedType node) { - IValue qualifier = visitChild(node.getQualifier()); @@ -935,6 +934,7 @@ public boolean visit(TextBlock node) { return false; } + @Override public boolean visit(YieldStatement node) { IValue exp = visitChild(node.getExpression()); @@ -942,6 +942,7 @@ public boolean visit(YieldStatement node) { return false; } + @Override public boolean visit(LambdaExpression node) { IListWriter parameters = values.listWriter(); @@ -1086,6 +1087,84 @@ public boolean visit(ExpressionMethodReference node) { return false; } + @Override + public boolean visit(ModuleDeclaration node) { + IList mod = node.isOpen() ? values.list(constructModifierNode("open")) : values.list(); + IString name = node.getName().isSimpleName() + ? values.string(((SimpleName) node.getName()).getIdentifier()) + : values.string(node.getName().getFullyQualifiedName()); + + IList stats + = ((List) node.moduleStatements()) + .stream() + .map(o -> (ASTNode) o) + .map(s -> visitChild(s)) + .collect(values.listWriter()); + + ownValue = constructDeclarationNode("module", mod, name, stats); + return false; + } + + @Override + public boolean visit(ModuleModifier node) { + if (node.isStatic()) { + ownValue = constructModifierNode("static"); + } + else if (node.isTransitive()) { + ownValue = constructModifierNode("static"); + } + else { + // unknown module requirement modifier? + assert false; + } + + return false; + } + + @Override + public boolean visit(OpensDirective node) { + IString name = values.string(node.getName().getFullyQualifiedName()); + IList modules = ((List) node.modules()).stream() + .map(e -> ((ASTNode) e)) + .map(n -> visitChild(n)) // TODO: check what type of AST node is used for the module names + .collect(values.listWriter()); + + ownValue = constructDeclarationNode("opensPackage", name, modules); + return false; + } + + @Override + public boolean visit(ProvidesDirective node) { + IString name = values.string(node.getName().getFullyQualifiedName()); + IList implementations = ((List) node.implementations()).stream() + .map(e -> ((ASTNode) e)) + .map(n -> visitChild(n)) // TODO: check what type of AST node is used for the module names + .collect(values.listWriter()); + + ownValue = constructDeclarationNode("providesImplementations", name, implementations); + return false; + } + + @Override + public boolean visit(RequiresDirective node) { + IList modifiers = ((List) node.modifiers()).stream() + .map(e -> ((ASTNode) e)) + .map(n -> visitChild(n)) + .collect(values.listWriter()); + IString name = values.string(node.getName().getFullyQualifiedName()); + + ownValue = constructDeclarationNode("requires", modifiers, name); + return false; + } + + @Override + public boolean visit(UsesDirective node) { + IString name = values.string(node.getName().getFullyQualifiedName()); + + ownValue = constructDeclarationNode("uses", name); + return false; + } + @Override public boolean visit(SuperMethodReference node) { IList args = ((List) node.typeArguments()) @@ -1099,7 +1178,6 @@ public boolean visit(SuperMethodReference node) { @Override public boolean visit(SwitchStatement node) { - IValue expression = visitChild(node.getExpression()); IListWriter statements = values.listWriter(); From 2c0f68becf7fcc837f3afb3ccfb29ed8f5d6b43d Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 17 Apr 2024 20:25:24 +0200 Subject: [PATCH 013/134] added exports directive --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 3 ++- .../library/lang/java/m3/internal/ASTConverter.java | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 427823b9669..3f21147cf90 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -60,8 +60,9 @@ data Declaration = \module(list[Modifier] open, str name, list[Declaration] directives) | \opensPackage(str name, list[Expression] modules) | \providesImplementations(str name, list[Expression] implementations) - | \requires(list[Modifier] modifiers, list[Expression] modules) + | \requires(list[Modifier] mods, list[Expression] modules) | \uses(Expression interface) + | \exports(Expression interface) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index a5cf07e8227..cce7e631e6c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1165,6 +1165,15 @@ public boolean visit(UsesDirective node) { return false; } + @Override + public boolean visit(ExportsDirective node) { + IString name = values.string(node.getName().getFullyQualifiedName()); + + ownValue = constructDeclarationNode("exports", name); + return false; + } + + @Override public boolean visit(SuperMethodReference node) { IList args = ((List) node.typeArguments()) From c20ad424fbdf6bb9f306f4f3e6844b186a77ae2b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 11:13:18 +0200 Subject: [PATCH 014/134] radically improved M3 documentation --- .../rascalmpl/library/analysis/m3/Core.rsc | 75 ++++++++++++++++--- 1 file changed, 66 insertions(+), 9 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/Core.rsc b/src/org/rascalmpl/library/analysis/m3/Core.rsc index 8b1321baa3e..767798c19b4 100644 --- a/src/org/rascalmpl/library/analysis/m3/Core.rsc +++ b/src/org/rascalmpl/library/analysis/m3/Core.rsc @@ -34,22 +34,79 @@ import List; import Relation; extend analysis::m3::TypeSymbol; +@synopsis{Modifier's are abstract syntax trees of type and declaration modifiers found in programming languages} +@description{ +In ((data::M3)) models the modifiers of each definition are collected for easy lookup. +} data Modifier; -@synopsis{m3 model constructor} +@synopsis{An _M3_ model is a composable database of ground-truth facts about a specific set of source code artifacts} @description{ -This constructor holds all information to an m3 model. It is identified by the _id_ field, -which should be a unique name for the project or file that the m3 model was constructor for. +This `m3` data constructor holds all information to an M3 model. It is identified by the _id_ field, +which should be a unique name for the project or file or composition that the M3 model was constructed for. + +Practically all relations in an M3 model relate source locations of the `loc` type: +1. _Name_ locations are logical locations that represent fully qualified names of declared artefacts. + * For example: `|java+method:///java/util/List/toString()|` + * Name locations are always indicated with the column name `name` in any relation below. +2. _Source_ location are physical locations that point to an exact (part of) a source code file: + * For example: `|project://jre13/src/main/java/java/util/List.java|(100,350,<20,0>,<25,10>)` + * Source locations are always indicated with the column name `src` in any relation below. + +These are the _core_ facts stored in M3 models because 90% of all programming languages have +these core features: +* `rel[loc name, loc src] declarations` maps qualified names of relations to their original source location in the current model, if any. +* `rel[loc src, loc name] uses` as the _inverse_ of `declarations` this maps every source location where a declared artefact is used to its fully qualified name. +* `set[loc] implicitDeclarations` provides a set of qualified names of things that are present no matter what in a programming language, for completeness sake. +* `rel[loc from, loc to] containment` links the qualified name of the outer (from) declaration to the names of everything that is declared inside of it (to). +* `rel[loc name, TypeSymbol typ] types` akin to the classical symbol table, this relation maps fully qualified names to a TypeSymbol representation of their static type. +* `rel[str simpleName, loc qualifiedName] names` is for producing human/user readable messages about declared artefacts; everu fully qualified name {c,sh,w}ould have one. +* `list[Message] messages` collects the errors and warnings produced the parser/compiler that populated this model. +* `rel[loc definition, loc comments]` documentation` links documentation strings (comments) inside the source code to specific declarations. A typical example would be _JavaDoc_ comments to a class definition. +* `rel[loc definition, Modifier modifier] modifiers` links modifiers to fully qualified declarations (typically access modifiers like `public` or `private` or storage modifiers such as `static`) + -Attached to this m3 model will be annotations with the specific information. +} +@benefits{ +* Logical name locations are both a readable and optimally accurate references to specific source code artefacts. No accidental confusion by mixing namespaces. +* Binary relations on locations are easily composed to infer new and interesting facts. + * In particular the composition operator and comprehensions can be used to easily deduce or infer more facts; + * Composing `declarations o uses` immediately generates a detailed dependency graph + * Composing `uses o declarations` immediately produces a _jump-to-definition_ graph, while its inverse `(uses o declarations)<1,0>` produces a _references_ graph. +* Specific programming paradigms and languages may add new facts to the M3 relation. + * For Java and C++ there would be class extension and interface implementation relations, for example. + * PHP would add a relation to link classes to traits, etc. etc. +* Every relation, set, list of facts in an M3 model is _composable_ by union or concatenation. +This makes an entire model composable by composing every item, respectively. The ((composeM3)) +function implements such a union. + * Composition can be used to easily construct project-level models from file-level models. + * Composition can be used to simulate (dynamic) linkage between projects. + * Composition can be used to start simulating remote-procedure calls and shared memory, and other inter-programming language composition like _JNI_. +} +@pitfalls{ +* Initial M3 models should not contain _inferred_ information, only ground truth data as extracted from parse trees or abstract syntax trees, and facts from the static name and type resolution stages of a compiler or interpreter. + * Inference is certainly possible (say to construct an over-approximated call graph), but that is not what we call an ```M3''' model. + * The reason is that _metrics_ of over- and under-approximated abstract interpretations of programs quickly loose their tractability and understandability, and also in + (the education of) empirical scientific methods it is of grave importance to separate facts from heuristic inference. +* Simply calling ((composeM3)) does not immediately represent the full static semantics of program composition. Namely. what the union of facts, as implemented by ((composeM3)) _means_ depends on programming language +semantics. Sometimes to connect the merged models also new connections must be made programmatically to complete the connections. Such analyses are static simulations of the `linking` and `loading` stages of programming languages. +When we simulate static composition, these analyses are ground truth, but when we simulate dynamic loading we have to treat the results as heuristic inferences. +* Not every programming language front-end that creates M3 models has to have implemented all the above relations (yet). Constructing +such a front-end may take time and incrementally growing models can already be very useful. +* Even though M3 models can have errors and be partially populated, please be aware that partially correct programs lead to partically correct models and all downstream analysis is correspondingly inaccurate. +* In statically types programming languages the `declarations` relation is typically one-to-one and the `uses` relation is `many-to-one`, +which means that name resolution is _unique_ at _compile-time_. However this is not required for other more dynamic languages, and this is fine. +You will see that one qualified name could potentionally resolve to different artefacts at run-time. This will be reflected by the `uses` relation +also having _many-to-many_ tuples in it. **Be careful how you count**, for example, _dependencies_ or _coupling_ in such cases since we +are literally already over-approximating the reality of the running program. } data M3( - rel[loc name, loc src] declarations = {}, // maps declarations to where they are declared. contains any kind of data or type or code declaration (classes, fields, methods, variables, etc. etc.) - set[loc] implicitDeclarations = {}, // some languages provide builtin implicit declarations, e.g. |java+class:///java/lang/Object| may not have a source location but still exist. - rel[loc name, TypeSymbol typ] types = {}, // assigns types to declared source code artifacts - rel[loc src, loc name] uses = {}, // maps source locations of usages to the respective declarations - rel[loc from, loc to] containment = {}, // what inner declaration (to) is logically contained in what outer declaration (`from`) (not necessarily physically, but usually also) + rel[loc name, loc src] declarations = {}, + set[loc] implicitDeclarations = {}, + rel[loc name, TypeSymbol typ] types = {}, + rel[loc src, loc name] uses = {}, + rel[loc from, loc to] containment = {}, list[Message] messages = [], // error messages and warnings produced while constructing a single m3 model rel[str simpleName, loc qualifiedName] names = {}, // convenience mapping from logical names to end-user readable (GUI) names, and vice versa rel[loc definition, loc comments] documentation = {}, // comments and javadoc attached to declared things From a26aad64e3e2faa769dafeafd1aa164a6f685485 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 12:10:23 +0200 Subject: [PATCH 015/134] typos --- .../rascalmpl/library/analysis/m3/Core.rsc | 112 +++++++++++------- .../lang/java/m3/internal/ASTConverter.java | 1 - 2 files changed, 71 insertions(+), 42 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/Core.rsc b/src/org/rascalmpl/library/analysis/m3/Core.rsc index 767798c19b4..fc23f4755c3 100644 --- a/src/org/rascalmpl/library/analysis/m3/Core.rsc +++ b/src/org/rascalmpl/library/analysis/m3/Core.rsc @@ -56,17 +56,21 @@ Practically all relations in an M3 model relate source locations of the `loc` ty These are the _core_ facts stored in M3 models because 90% of all programming languages have these core features: -* `rel[loc name, loc src] declarations` maps qualified names of relations to their original source location in the current model, if any. -* `rel[loc src, loc name] uses` as the _inverse_ of `declarations` this maps every source location where a declared artefact is used to its fully qualified name. -* `set[loc] implicitDeclarations` provides a set of qualified names of things that are present no matter what in a programming language, for completeness sake. -* `rel[loc from, loc to] containment` links the qualified name of the outer (from) declaration to the names of everything that is declared inside of it (to). -* `rel[loc name, TypeSymbol typ] types` akin to the classical symbol table, this relation maps fully qualified names to a TypeSymbol representation of their static type. -* `rel[str simpleName, loc qualifiedName] names` is for producing human/user readable messages about declared artefacts; everu fully qualified name {c,sh,w}ould have one. -* `list[Message] messages` collects the errors and warnings produced the parser/compiler that populated this model. -* `rel[loc definition, loc comments]` documentation` links documentation strings (comments) inside the source code to specific declarations. A typical example would be _JavaDoc_ comments to a class definition. -* `rel[loc definition, Modifier modifier] modifiers` links modifiers to fully qualified declarations (typically access modifiers like `public` or `private` or storage modifiers such as `static`) - +| Ground truth fact kind about source code | Description | +| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `set[Language]` | describes the languages this model contains information about, including their version numbers for the sake of transparency | +| `rel[loc name, loc src] declarations` | maps qualified names of relations to their original source location in the current model, if any. | +| `rel[loc src, loc name] uses` | as the _inverse_ of `declarations` this maps every source location where a declared artefact is used to its fully qualified name.| +| `set[loc] implicitDeclarations` | provides a set of qualified names of things that are present no matter what in a programming language, for completeness sake.| +| `rel[loc from, loc to] containment` | links the qualified name of the outer (from) declaration to the names of everything that is declared inside of it (to).| +| `rel[loc name, TypeSymbol typ] types` | akin to the classical symbol table, this relation maps fully qualified names to a TypeSymbol representation of their static type.| +| `rel[str simpleName, loc qualifiedName] names` | is for producing human/user readable messages about declared artefacts; every fully qualified name {c,sh,w}ould have one.| +| `list[Message] messages` | collects the errors and warnings produced the parser/compiler that populated this model. | +| `rel[loc definition, loc comments]` documentation` | links documentation strings (comments) inside the source code to specific declarations. A typical example would be _JavaDoc_ comments to a class definition.| +| `rel[loc definition, Modifier modifier] modifiers` | links modifiers to fully qualified declarations (typically access modifiers like `public` or `private` or storage modifiers such as `static`)| + +More relations would be added by M3 model builders for specific programming paradigms. } @benefits{ * Logical name locations are both a readable and optimally accurate references to specific source code artefacts. No accidental confusion by mixing namespaces. @@ -74,6 +78,7 @@ these core features: * In particular the composition operator and comprehensions can be used to easily deduce or infer more facts; * Composing `declarations o uses` immediately generates a detailed dependency graph * Composing `uses o declarations` immediately produces a _jump-to-definition_ graph, while its inverse `(uses o declarations)<1,0>` produces a _references_ graph. +* M3 models never use _maps_ because those are not safely compositional (one maps could overwrite the facts of another). * Specific programming paradigms and languages may add new facts to the M3 relation. * For Java and C++ there would be class extension and interface implementation relations, for example. * PHP would add a relation to link classes to traits, etc. etc. @@ -86,10 +91,10 @@ function implements such a union. } @pitfalls{ * Initial M3 models should not contain _inferred_ information, only ground truth data as extracted from parse trees or abstract syntax trees, and facts from the static name and type resolution stages of a compiler or interpreter. - * Inference is certainly possible (say to construct an over-approximated call graph), but that is not what we call an ```M3''' model. + * Inference is certainly possible (say to construct an over-approximated call graph), but that is _not_ what we call an _M3_ model. * The reason is that _metrics_ of over- and under-approximated abstract interpretations of programs quickly loose their tractability and understandability, and also in (the education of) empirical scientific methods it is of grave importance to separate facts from heuristic inference. -* Simply calling ((composeM3)) does not immediately represent the full static semantics of program composition. Namely. what the union of facts, as implemented by ((composeM3)) _means_ depends on programming language +* Simply calling ((composeM3)) does not immediately represent the full static semantics of program composition. Namely, what the union of facts, as implemented by ((composeM3)) _means_ depends on programming language semantics. Sometimes to connect the merged models also new connections must be made programmatically to complete the connections. Such analyses are static simulations of the `linking` and `loading` stages of programming languages. When we simulate static composition, these analyses are ground truth, but when we simulate dynamic loading we have to treat the results as heuristic inferences. * Not every programming language front-end that creates M3 models has to have implemented all the above relations (yet). Constructing @@ -102,28 +107,49 @@ also having _many-to-many_ tuples in it. **Be careful how you count**, for examp are literally already over-approximating the reality of the running program. } data M3( + set[Language] languages = {}, rel[loc name, loc src] declarations = {}, set[loc] implicitDeclarations = {}, rel[loc name, TypeSymbol typ] types = {}, rel[loc src, loc name] uses = {}, rel[loc from, loc to] containment = {}, - list[Message] messages = [], // error messages and warnings produced while constructing a single m3 model - rel[str simpleName, loc qualifiedName] names = {}, // convenience mapping from logical names to end-user readable (GUI) names, and vice versa - rel[loc definition, loc comments] documentation = {}, // comments and javadoc attached to declared things - rel[loc definition, Modifier modifier] modifiers = {} // modifiers associated with declared things -) = m3( - loc id); + list[Message] messages = [], + rel[str simpleName, loc qualifiedName] names = {}, + rel[loc definition, loc comments] documentation = {}, + rel[loc definition, Modifier modifier] modifiers = {} +) = m3(loc id); +@synopsis{Extensible data-type to define language names and their versions} +@description{ +Most ground truth facts about source code require analysis tooling that is specific to the language: +* parsers +* name analysis +* type analysis + +However, there are language analysis methods that are _language agnostic_ such as counting lines of code. +For this we have the `generic()` language name. +} public data Language(str version = "") = generic() ; -@synopsis{Create an empty m3 term with empty annotations} -//TODO: Deprecated method, replace any calls to this method with default constructor -public M3 emptyM3(loc id) = m3(id); - -@synopsis{Generic function to compose the annotations of a set of M3s.} +@synopsis{Generic function to compose the facts of a set of M3s into a single model.} +@description{ +We iterate over all the facts stored in every model, and use set union or list concatenation +to collect the elements of all relations and lists. +} +@pitfalls{ +* If the quality of the qualified names in the original models is lacking, than this is the moment that different +declarations might be conflated with the same fully qualified name. All downstream analysis is broken then. +* This function does not compose the extended facts for specific programming languages yet. +} +@benefits{ +* Composition satisfies the requirements for many downstream analyses: + * Composition can be used to easily construct project-level models from file-level models, e.g. for open-source project analysis. + * Composition can be used to simulate (dynamic) linkage between projects, e.g. for whole-program analysis. + * Composition can be used to start simulating remote-procedure calls and shared memory, and other inter-programming language composition like _JNI_. +} @memo M3 composeM3(loc id, set[M3] models) { M3 comp = m3(id); @@ -190,16 +216,7 @@ M3 modifyM3(loc id, list[M3] models, value (&T,&T) fun) { bool isEmpty(M3 model) = model.id.scheme == "unknown"; - -@synopsis{constructs a recursive FileSystem from a binary [Location] relation.} -@description{ - -} -@memo set[FileSystem] relToFileSystem(rel[loc parent, loc child] r) { - FileSystem rec(loc l, set[loc] args) = (args == {}) ? file(l) : directory(l, {rec(c, r[c]) | c <- args}); - return {rec(t, r[t]) | t <- top(r)}; -} - +@deprecated{does not make much sense since containment usually contains only logical locations..} set[loc] files(M3 model) { todo = top(model.containment); done = {}; @@ -217,20 +234,25 @@ set[loc] files(M3 model) { return done; } - -@synopsis{transform the containment relation to a recursive tree model} +@synopsis{Transform the containment relation to a recursive tree model} @description{ - +This makes the containment relation into an abstract ((FileSystem)) for further analysis, +or visualization. } @benefits{ * Transforming the containment relation to a tree model allows further analysis using operators -such as `visit` and descendant matching (`/`)which is sometimes more convenient. +such as `visit` and descendant matching (`/`) which is sometimes more convenient. +* The tree shape is better for visualization purposes. } -@pitfalls{ -* Do not forget that the relational operators such as [TransitiveClosure], [Comprehension] and [Composition] may be just -as effective and perhaps more efficient, as applied directly on the containment relation. +set[FileSystem] containmentToFileSystem(M3 model) { + @memo + set[FileSystem] relToFileSystem(rel[loc parent, loc child] r) { + FileSystem rec(loc l, set[loc] args) = (args == {}) ? file(l) : directory(l, {rec(c, r[c]) | c <- args}); + return {rec(t, r[t]) | t <- top(r)}; + } + + return relToFileSystem(model.containment); } -set[FileSystem] containmentToFileSystem(M3 model) = relToFileSystem(model.containment); list[Message] checkM3(M3 model) { result = [m | m <- model.messages, m is error]; @@ -239,6 +261,14 @@ list[Message] checkM3(M3 model) { return result; } +@synopsis{Helper function to test the quality of what specific language front-ends produce.} +@benefits{ +* Front-end construction is tricky business. This test provides a basic sanity check. +} +@pitfalls{ +* This specification assumes a _closed world_ perspective; so test only on models that include +the facts for all the things that are depended on. +} bool testM3ModelConsistency(M3 m) { decls = m.declarations; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index cce7e631e6c..baedb3a66c8 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1172,7 +1172,6 @@ public boolean visit(ExportsDirective node) { ownValue = constructDeclarationNode("exports", name); return false; } - @Override public boolean visit(SuperMethodReference node) { From cdf7dd6356ed654e9b38763280f2bd0b56760ea2 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:04:09 +0200 Subject: [PATCH 016/134] composeM3 is now _generic_ for all M3 models for all languages, as long as only set and relation fields are being used --- .../rascalmpl/library/analysis/m3/Core.rsc | 60 ++++++++++++------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/Core.rsc b/src/org/rascalmpl/library/analysis/m3/Core.rsc index fc23f4755c3..e615050439b 100644 --- a/src/org/rascalmpl/library/analysis/m3/Core.rsc +++ b/src/org/rascalmpl/library/analysis/m3/Core.rsc @@ -88,6 +88,10 @@ function implements such a union. * Composition can be used to easily construct project-level models from file-level models. * Composition can be used to simulate (dynamic) linkage between projects. * Composition can be used to start simulating remote-procedure calls and shared memory, and other inter-programming language composition like _JNI_. +* M3 models can be cached (efficiently) on disk using functions from ((util::ValueIO)). A single stored M3 model simulates an _object file_, +while a composed M3 model is more like an `.a` archive or a `.jar` archive. + * Integrating M3 model caching during a build process (e.g ANT, Makefiles or Maven) is a smart way to make whole program analysis fast and incremental. + * Integrating M3 model caching in Integrated Development Environments (e.g. the Language Server Protocol) enables fast and incremental IDE features based on whole program indexing that M3 provides. } @pitfalls{ * Initial M3 models should not contain _inferred_ information, only ground truth data as extracted from parse trees or abstract syntax trees, and facts from the static name and type resolution stages of a compiler or interpreter. @@ -107,15 +111,15 @@ also having _many-to-many_ tuples in it. **Be careful how you count**, for examp are literally already over-approximating the reality of the running program. } data M3( - set[Language] languages = {}, - rel[loc name, loc src] declarations = {}, - set[loc] implicitDeclarations = {}, - rel[loc name, TypeSymbol typ] types = {}, - rel[loc src, loc name] uses = {}, - rel[loc from, loc to] containment = {}, - list[Message] messages = [], - rel[str simpleName, loc qualifiedName] names = {}, - rel[loc definition, loc comments] documentation = {}, + set[Language] languages = {}, + rel[loc name, loc src] declarations = {}, + set[loc] implicitDeclarations = {}, + rel[loc name, TypeSymbol typ] types = {}, + rel[loc src, loc name] uses = {}, + rel[loc from, loc to] containment = {}, + list[Message] messages = [], + rel[str simpleName, loc qualifiedName] names = {}, + rel[loc definition, loc comments] documentation = {}, rel[loc definition, Modifier modifier] modifiers = {} ) = m3(loc id); @@ -143,28 +147,44 @@ to collect the elements of all relations and lists. * If the quality of the qualified names in the original models is lacking, than this is the moment that different declarations might be conflated with the same fully qualified name. All downstream analysis is broken then. * This function does not compose the extended facts for specific programming languages yet. +* If extended M3 models use something other than sets, lists or relations, this composition function ignores them completely. +* Composed models can be huge in memory. Make sure to allocate enough heap for the JVM. Real world programs of real world product +can take gigabytes of memory, even when compressed and optimized as M3 models. } @benefits{ * Composition satisfies the requirements for many downstream analyses: * Composition can be used to easily construct project-level models from file-level models, e.g. for open-source project analysis. * Composition can be used to simulate (dynamic) linkage between projects, e.g. for whole-program analysis. * Composition can be used to start simulating remote-procedure calls and shared memory, and other inter-programming language composition like _JNI_. +* Transitive closure on composed models leads to effective (and fast) reachability analysis. +* This function is rather memory-efficient by iterating over the already in-memory keyword parameter sets and lists, and +splicing the unions into an incremental transiently growing set or list via the comprehension. This avoids a lot of copying +and intermediate memory allocation which can be detrimental when doing large whole program analyses. } @memo M3 composeM3(loc id, set[M3] models) { M3 comp = m3(id); + fields = (m:getKeywordParameters(m) | m <- models); + keys = {*domain(getKeywordParameters(m)) | m <- models }; + result = (); + + // first we do only the sets, to use efficient set union/splicing + for (k <- keys) { + newSet = {*elems | m <- models, set[value] elems := fields[m][k]}; + if (newSet != {}) { // don't set anything if the result is empty (it could be a list!) + result[k] = newSet; + } + } + + // then we do only the lists, to use efficient list splicing + for (k <- keys) { + newList = [*elems | m <- models, list[value] elems := fields[m][k]]; + if (newList != []) { // don't set anything if the result is empty (it could be a set!) + result[k] = newList; + } + } - comp.declarations = {*model.declarations | model <- models}; - comp.implicitDeclarations = {*model.implicitDeclarations | model <- models}; - comp.types = {*model.types | model <- models}; - comp.uses = {*model.uses | model <- models}; - comp.containment = {*model.containment | model <- models}; - comp.messages = [*model.messages | model <- models]; - comp.names = {*model.names | model <- models}; - comp.documentation = {*model.documentation | model <- models}; - comp.modifiers = {*model.modifiers | model <- models}; - - return comp; + return setKeywordParameters(comp, result); } @synopsis{Generic function to apply a difference over the annotations of a list of M3s.} From 665051e135c259c545aeff63c574093787e6d2df Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:05:04 +0200 Subject: [PATCH 017/134] added missing mergeKeywordParameters function for adding new keyword parameters to a node without having to repeat the existing ones --- src/org/rascalmpl/library/Node.rsc | 11 +++++++++++ src/org/rascalmpl/library/Prelude.java | 6 ++++++ 2 files changed, 17 insertions(+) diff --git a/src/org/rascalmpl/library/Node.rsc b/src/org/rascalmpl/library/Node.rsc index ff146416bec..53ad3dac255 100644 --- a/src/org/rascalmpl/library/Node.rsc +++ b/src/org/rascalmpl/library/Node.rsc @@ -65,6 +65,17 @@ setKeywordParameters("f"(10, "abc"), ("height":0)); @javaClass{org.rascalmpl.library.Prelude} public java &T <: node setKeywordParameters(&T <: node x, map[str,value] keywordParameters); +@synopsis{Adds new keyword parameters to a node, keeping the existing ones unless there is an entry in the new map.} +@examples{ +```rascal-shell +import Node; +mergeKeywordParameters("f"(10, "abc", width=10), ("height":0)); +``` +} +@javaClass{org.rascalmpl.library.Prelude} +public java &T <: node mergeKeywordParameters(&T <: node x, map[str,value] keywordParameters); + + @deprecated{ Use setKeywordParameters(x, keywordParameters) } diff --git a/src/org/rascalmpl/library/Prelude.java b/src/org/rascalmpl/library/Prelude.java index 409bb0f93f0..8bb4bbb4de1 100644 --- a/src/org/rascalmpl/library/Prelude.java +++ b/src/org/rascalmpl/library/Prelude.java @@ -2201,6 +2201,12 @@ public INode setKeywordParameters(INode node, IMap kwargs) { kwargs.entryIterator().forEachRemaining((kv) -> map.put(((IString)kv.getKey()).getValue(), kv.getValue())); return node.asWithKeywordParameters().setParameters(map); } + + public INode mergeKeywordParameters(INode node, IMap kwargs) { + Map map = node.asWithKeywordParameters().getParameters(); + kwargs.entryIterator().forEachRemaining((kv) -> map.put(((IString)kv.getKey()).getValue(), kv.getValue())); + return node.asWithKeywordParameters().setParameters(map); + } public INode unset(INode node, IString label) { return node.mayHaveKeywordParameters() ? node.asWithKeywordParameters().unsetParameter(label.getValue()) : node; From ce40c5f650b0432317704a29883673e939c6bf5c Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:05:18 +0200 Subject: [PATCH 018/134] documented TypeSymbol better --- .../library/analysis/m3/TypeSymbol.rsc | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc b/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc index e21058972cf..3be65690048 100644 --- a/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc +++ b/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc @@ -1,5 +1,5 @@ -@synopsis{a symbolic representation for types that occur in programming languages.} +@synopsis{Symbolic representation for types that occur in programming languages.} @description{ M3 provides a general mechanism to associate types, symbolically, with source code artifacts or even run-time artifacts. @@ -13,16 +13,22 @@ We cater for languages to have a subtype relation to be defined, and a least upp You will find an interesting examples in ((lang::java::m3::TypeSymbol)). } @benefits{ -* symbolic types can be analyzed and manipulated symbolically, i.e. to instatiate parametrized types. -* symbolic types can be used directly as constraint variables. +* symbolic types can be analyzed and manipulated symbolically, i.e. to instatiate parametrized types. +* symbolic types can be used directly as constraint variables for type inference or type-based refactoring purposes. } @pitfalls{ -* If you import extensions to this M3 model for two different languages, ambiguity and other confusion may arise +* If you import extensions to this M3 model for two different languages, ambiguity and other confusion may arise because the subtype and lub functions of the two languages will merge. +* TypeSymbols are sometimes confused with their predecessors in the analysis pipeline: abstract syntax trees of `Type`. + * If `Type` is the syntax of types, then `TypeSymbol` represents their semantics. + * Programmers can only type in `Type` instances, while programming languages may also feature types which do not have syntax (such as union an intersection types during inference). + * Type and TypeSymbol constructors are the same when they are related, i.e. Type::\int() will produce TypeSymbol::\int(). + * Often different ways of writing the same type in syntax, produce a normal and simplified form in TypeSymbol representation. + * Abstract or generic (parameterized) TypeSymbols can be instantiated during abstract interpretation and other analysis algorithms. + * Instances of syntactic `Type` always have their `src` location with them, while most TypeSymbols are deduced and inferred and do not + have a clear source origin. } module analysis::m3::TypeSymbol -data TypeSymbol = \any(); +data TypeSymbol; -bool subtype(\any(), \any()) = true; -TypeSymbol lub(\any(), \any()) = \any(); From 687994518418b4123ee15244eaa73d5c57f89612 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:05:47 +0200 Subject: [PATCH 019/134] using the Language concept from M3 to encode language name and version --- .../rascalmpl/library/lang/java/m3/AST.rsc | 42 ++++++++++--------- .../java/m3/internal/EclipseJavaCompiler.java | 4 +- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 3f21147cf90..bc11899684b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -12,21 +12,25 @@ import String; import List; @synopsis{Datatype to configure the Java Language Standard compliance level of the parser.} -data JavaVersion = javaVersion(int level, str version, bool preview=true); +@description{ +This is the Language data-type of core M3 that we use to document the language level, as well +as configure the JDK compiler before extracting the relevant facts. +} +data Language = \java(int level = 13, str version="13", bool preview=true); -JavaVersion JLS1() = javaVersion(1, "1.1"); -JavaVersion JLS2() = javaVersion(2, "1.2"); -JavaVersion JLS3() = javaVersion(3, "1.3"); -JavaVersion JLS4() = javaVersion(4, "1.4"); -JavaVersion JLS5() = javaVersion(5, "1.5"); -JavaVersion JLS6() = javaVersion(6, "1.6"); -JavaVersion JLS7() = javaVersion(7, "1.7"); -JavaVersion JLS8() = javaVersion(8, "1.8"); -JavaVersion JLS9() = javaVersion(9, "9"); -JavaVersion JLS10() = javaVersion(10, "10"); -JavaVersion JLS11() = javaVersion(11, "11"); -JavaVersion JLS12() = javaVersion(12, "12"); -JavaVersion JLS13() = javaVersion(13, "13"); +Language JLS1() = \java(level=1, version="1.1"); +Language JLS2() = \java(level=2, version="1.2"); +Language JLS3() = \java(level=3, version="1.3"); +Language JLS4() = \java(level=4, version="1.4"); +Language JLS5() = \java(level=5, version="1.5"); +Language JLS6() = \java(level=6, version="1.6"); +Language JLS7() = \java(level=7, version="1.7"); +Language JLS8() = \java(level=8, version="1.8"); +Language JLS9() = \java(level=9, version="9"); +Language JLS10() = \java(level=10, version="10"); +Language JLS11() = \java(level=11, version="11"); +Language JLS12() = \java(level=12, version="12"); +Language JLS13() = \java(level=13, version="13"); data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) @@ -238,7 +242,7 @@ set[loc] findRoots(set[loc] folders) { @description{ Wrapper around ((createAstsFromFiles)) to call it on a single file. } -public Declaration createAstFromFile(loc file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], JavaVersion javaVersion = JLS13()) { +public Declaration createAstFromFile(loc file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()) { result = createAstsFromFiles({file}, collectBindings, errorRecovery = errorRecovery, sourcePath = sourcePath, classPath = classPath, javaVersion = javaVersion); if ({oneResult} := result) { return oneResult; @@ -252,11 +256,11 @@ public Declaration createAstFromFile(loc file, bool collectBindings, bool errorR Meaning, that it analyzes the whole file and not just the part that the positional information describes. } @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -public java set[Declaration] createAstsFromFiles(set[loc] file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], JavaVersion javaVersion = JLS13()); +public java set[Declaration] createAstsFromFiles(set[loc] file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()); @synopsis{Creates AST from a string using Eclipse JDT compiler.} @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -public java Declaration createAstFromString(loc fileName, str source, bool collectBinding, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], JavaVersion javaVersion = JLS13()); +public java Declaration createAstFromString(loc fileName, str source, bool collectBinding, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()); @synopsis{Creates a set ASTs for all Java source files in a project using Eclipse's JDT compiler} @description{ @@ -264,7 +268,7 @@ public java Declaration createAstFromString(loc fileName, str source, bool colle The function also looks for the dependencies (`.jar` files) to include them. Wraps around ((createAstsFromFiles)). } -public set[Declaration] createAstsFromDirectory(loc project, bool collectBindings, bool errorRecovery = false, JavaVersion javaVersion = JLS13() ) { +public set[Declaration] createAstsFromDirectory(loc project, bool collectBindings, bool errorRecovery = false, Language javaVersion = JLS13() ) { if (!(isDirectory(project))) { throw " is not a valid directory"; } @@ -283,7 +287,7 @@ is expected to be at `project + "pom.xml"`. Wraps around ((createAstsFromFiles)). } -public set[Declaration] createAstsFromMavenProject(loc project, bool collectBindings, bool errorRecovery = false, JavaVersion javaVersion = JLS13() ) { +public set[Declaration] createAstsFromMavenProject(loc project, bool collectBindings, bool errorRecovery = false, Language javaVersion = JLS13() ) { if (!exists(project + "pom.xml")) { throw IO("pom.xml not found"); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index 08b3f5c47e8..935b53c8e89 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -307,8 +307,8 @@ protected ASTParser constructASTParser(boolean resolveBindings, boolean errorRec Hashtable options = new Hashtable(); - options.put(JavaCore.COMPILER_SOURCE, ((IString) javaVersion.get("version")).getValue()); - options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.get("version")).getValue()); + options.put(JavaCore.COMPILER_SOURCE, ((IString) javaVersion.asWithKeywordParameters().getParameter("version")).getValue()); + options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.asWithKeywordParameters().getParameter("version")).getValue()); options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, previewParameter.getValue() ? JavaCore.ENABLED : JavaCore.DISABLED); options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED); From 35b534091553cc5b816152ef2eda4ca904ed387c Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:28:11 +0200 Subject: [PATCH 020/134] fixed initial problems in module spec parser, but some of the fields are still str that should be Expression in my mind --- .../library/lang/java/examples/NewSwitch.java | 11 ------- .../rascalmpl/library/lang/java/m3/AST.rsc | 13 ++++---- .../lang/java/m3/internal/ASTConverter.java | 32 +++++++++++-------- 3 files changed, 26 insertions(+), 30 deletions(-) delete mode 100644 src/org/rascalmpl/library/lang/java/examples/NewSwitch.java diff --git a/src/org/rascalmpl/library/lang/java/examples/NewSwitch.java b/src/org/rascalmpl/library/lang/java/examples/NewSwitch.java deleted file mode 100644 index 42d41d3d30d..00000000000 --- a/src/org/rascalmpl/library/lang/java/examples/NewSwitch.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.rascalmpl.library.lang.java.examples; - -public class NewSwitch { - int testFunction(int i) { - return switch(i) { - case 0,1,2 -> 1; - case 3,4,5 -> 2; - default: yield 3; - }; - } -} diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index bc11899684b..a6c5bf7b041 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -2,8 +2,8 @@ module lang::java::m3::AST extend analysis::m3::AST; -extend analysis::m3::Core; // necessary for initializing EclipseJavaCompiler class -extend lang::java::m3::TypeSymbol; // necessary for initializing EclipseJavaCompiler class to express type annotations +extend analysis::m3::Core; // NB! contains necessary declarations for initializing EclipseJavaCompiler object even if unused here +extend lang::java::m3::TypeSymbol; // NB! necessary for initializing EclipseJavaCompiler object even if unused here import util::FileSystem; import util::Reflective; @@ -34,6 +34,7 @@ Language JLS13() = \java(level=13, version="13"); data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) + | \compilationUnit(Declaration \module) | \compilationUnit(Declaration package, list[Declaration] imports, list[Declaration] types) | \enum(str name, list[Type] implements, list[Declaration] constants, list[Declaration] body) | \enumConstant(str name, list[Expression] arguments, Declaration class) @@ -64,13 +65,13 @@ data Declaration = \module(list[Modifier] open, str name, list[Declaration] directives) | \opensPackage(str name, list[Expression] modules) | \providesImplementations(str name, list[Expression] implementations) - | \requires(list[Modifier] mods, list[Expression] modules) - | \uses(Expression interface) - | \exports(Expression interface) + | \requires(list[Modifier] mods, str name) + | \uses(str interface) + | \exports(str interface) ; -data Expression +data Expression(TypeSymbol typ=\unresolved()) = \arrayAccess(Expression array, Expression index) | \newArray(Type \type, list[Expression] dimensions, Expression init) | \newArray(Type \type, list[Expression] dimensions) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index baedb3a66c8..39dfa9c477d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -283,22 +283,28 @@ public boolean visit(ClassInstanceCreation node) { @Override public boolean visit(CompilationUnit node) { - IValue packageOfUnit = node.getPackage() == null ? null : visitChild(node.getPackage()); - - IListWriter imports = values.listWriter(); - for (Iterator it = node.imports().iterator(); it.hasNext();) { - ImportDeclaration d = (ImportDeclaration) it.next(); - imports.append(visitChild(d)); + if (node.getModule() != null) { + ownValue = constructDeclarationNode("compilationUnit", visitChild(node.getModule())); + return false; } + else { + IValue packageOfUnit = node.getPackage() == null ? null : visitChild(node.getPackage()); - IListWriter typeDeclarations = values.listWriter(); - for (Iterator it = node.types().iterator(); it.hasNext();) { - AbstractTypeDeclaration d = (AbstractTypeDeclaration) it.next(); - typeDeclarations.append(visitChild(d)); - } + IListWriter imports = values.listWriter(); + for (Iterator it = node.imports().iterator(); it.hasNext();) { + ImportDeclaration d = (ImportDeclaration) it.next(); + imports.append(visitChild(d)); + } - ownValue = constructDeclarationNode("compilationUnit", packageOfUnit, imports.done(), typeDeclarations.done()); - return false; + IListWriter typeDeclarations = values.listWriter(); + for (Iterator it = node.types().iterator(); it.hasNext();) { + AbstractTypeDeclaration d = (AbstractTypeDeclaration) it.next(); + typeDeclarations.append(visitChild(d)); + } + + ownValue = constructDeclarationNode("compilationUnit", packageOfUnit, imports.done(), typeDeclarations.done()); + return false; + } } @Override From fb138b0b196d3de58b3355de1b0d99313ad4f0f9 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:36:04 +0200 Subject: [PATCH 021/134] fixed all name references in ASTs of module declarations --- .../rascalmpl/library/lang/java/m3/AST.rsc | 12 +++++------ .../lang/java/m3/internal/ASTConverter.java | 20 +++++++++---------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index a6c5bf7b041..456265028ae 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -62,12 +62,12 @@ data Declaration @synopsis{These declarations types are related to the Java 9 module system} data Declaration - = \module(list[Modifier] open, str name, list[Declaration] directives) - | \opensPackage(str name, list[Expression] modules) - | \providesImplementations(str name, list[Expression] implementations) - | \requires(list[Modifier] mods, str name) - | \uses(str interface) - | \exports(str interface) + = \module(list[Modifier] open, Expression \moduleName, list[Declaration] directives) + | \opensPackage(Expression package, list[Expression] openedToModules) + | \providesImplementations(Expression interface, list[Expression] implementations) + | \requires(list[Modifier] mods, Expression \moduleName) + | \uses(Expression interface) + | \exports(Expression interface) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 39dfa9c477d..ec8e71c527c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1096,9 +1096,7 @@ public boolean visit(ExpressionMethodReference node) { @Override public boolean visit(ModuleDeclaration node) { IList mod = node.isOpen() ? values.list(constructModifierNode("open")) : values.list(); - IString name = node.getName().isSimpleName() - ? values.string(((SimpleName) node.getName()).getIdentifier()) - : values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IList stats = ((List) node.moduleStatements()) @@ -1129,10 +1127,10 @@ else if (node.isTransitive()) { @Override public boolean visit(OpensDirective node) { - IString name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IList modules = ((List) node.modules()).stream() .map(e -> ((ASTNode) e)) - .map(n -> visitChild(n)) // TODO: check what type of AST node is used for the module names + .map(n -> visitChild(n)) .collect(values.listWriter()); ownValue = constructDeclarationNode("opensPackage", name, modules); @@ -1141,10 +1139,10 @@ public boolean visit(OpensDirective node) { @Override public boolean visit(ProvidesDirective node) { - IString name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IList implementations = ((List) node.implementations()).stream() .map(e -> ((ASTNode) e)) - .map(n -> visitChild(n)) // TODO: check what type of AST node is used for the module names + .map(n -> visitChild(n)) .collect(values.listWriter()); ownValue = constructDeclarationNode("providesImplementations", name, implementations); @@ -1157,7 +1155,7 @@ public boolean visit(RequiresDirective node) { .map(e -> ((ASTNode) e)) .map(n -> visitChild(n)) .collect(values.listWriter()); - IString name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); ownValue = constructDeclarationNode("requires", modifiers, name); return false; @@ -1165,15 +1163,15 @@ public boolean visit(RequiresDirective node) { @Override public boolean visit(UsesDirective node) { - IString name = values.string(node.getName().getFullyQualifiedName()); - + IValue name = visitChild(node.getName()); + ownValue = constructDeclarationNode("uses", name); return false; } @Override public boolean visit(ExportsDirective node) { - IString name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); ownValue = constructDeclarationNode("exports", name); return false; From 14ca354127da80b136dc6472d80e185063f99a0b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:39:29 +0200 Subject: [PATCH 022/134] fixed names in method references --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 8 ++++---- .../library/lang/java/m3/internal/ASTConverter.java | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 456265028ae..70cadd564a3 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -63,7 +63,7 @@ data Declaration @synopsis{These declarations types are related to the Java 9 module system} data Declaration = \module(list[Modifier] open, Expression \moduleName, list[Declaration] directives) - | \opensPackage(Expression package, list[Expression] openedToModules) + | \opensPackage(Expression packageName, list[Expression] openedToModules) | \providesImplementations(Expression interface, list[Expression] implementations) | \requires(list[Modifier] mods, Expression \moduleName) | \uses(Expression interface) @@ -109,9 +109,9 @@ data Expression(TypeSymbol typ=\unresolved()) | \simpleName(str name) | \switch(Expression expression, list[Statement] cases) | \markerAnnotation(str typeName) - | \methodReference(Type \type, list[Type] typeArguments, str name) - | \methodReference(Expression expression, list[Type] typeArguments, str name) - | \superMethodReference(list[Type] typeArguments, str name) + | \methodReference(Type \type, list[Type] typeArguments, Expression name) + | \methodReference(Expression expression, list[Type] typeArguments, Expression name) + | \superMethodReference(list[Type] typeArguments, Expression name) | \normalAnnotation(str typeName, list[Expression] memberValuePairs) | \memberValuePair(str name, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index ec8e71c527c..bee5fcaf9f9 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1075,7 +1075,7 @@ public boolean visit(TypeMethodReference node) { IList args = ((List) node.typeArguments()) .stream() .map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); - IString name = values.string(node.getName().getIdentifier()); + IValue name = visitChild(node.getName()); ownValue = constructExpressionNode("methodReference", type, args, name); return false; @@ -1087,7 +1087,7 @@ public boolean visit(ExpressionMethodReference node) { IList args = ((List) node.typeArguments()) .stream() .map(o -> (Type) o).map(t -> visitChild(t)).collect(values.listWriter()); - IString name = values.string(node.getName().getIdentifier()); + IValue name = visitChild(node.getName()); ownValue = constructExpressionNode("methodReference", type, args, name); return false; @@ -1182,7 +1182,7 @@ public boolean visit(SuperMethodReference node) { IList args = ((List) node.typeArguments()) .stream().map(o -> (Type) o) .map(t -> visitChild(t)).collect(values.listWriter()); - IString name = values.string(node.getName().getIdentifier()); + IValue name = visitChild(node.getName()); ownValue = constructExpressionNode("superMethodReference", args, name); return false; From 69c90dabd879d928e3a4dc85ae17f18ff6e8412a Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 13:43:31 +0200 Subject: [PATCH 023/134] layout --- .../lang/java/m3/internal/ASTConverter.java | 58 ++----------------- 1 file changed, 5 insertions(+), 53 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index bee5fcaf9f9..773282e2d2d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -323,7 +323,6 @@ public boolean visit(ConstructorInvocation node) { IListWriter types = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); types.append(visitChild(t)); @@ -345,7 +344,6 @@ public boolean visit(ConstructorInvocation node) { @Override public boolean visit(ContinueStatement node) { - IValue label = node.getLabel() == null ? null : values.string(node.getLabel().getFullyQualifiedName()); ownValue = constructStatementNode("continue", label); @@ -354,7 +352,6 @@ public boolean visit(ContinueStatement node) { @Override public boolean visit(DoStatement node) { - IValue body = visitChild(node.getBody()); IValue whileExpression = visitChild(node.getExpression()); @@ -365,7 +362,6 @@ public boolean visit(DoStatement node) { @Override public boolean visit(EmptyStatement node) { - ownValue = constructStatementNode("empty"); return false; @@ -373,7 +369,6 @@ public boolean visit(EmptyStatement node) { @Override public boolean visit(EnhancedForStatement node) { - IValue parameter = visitChild(node.getParameter()); IValue collectionExpression = visitChild(node.getExpression()); IValue body = visitChild(node.getBody()); @@ -385,7 +380,6 @@ public boolean visit(EnhancedForStatement node) { @Override public boolean visit(EnumConstantDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -406,7 +400,6 @@ public boolean visit(EnumConstantDeclaration node) { @Override public boolean visit(EnumDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -439,7 +432,6 @@ public boolean visit(EnumDeclaration node) { @Override public boolean visit(ExpressionStatement node) { - IValue expression = visitChild(node.getExpression()); ownValue = constructStatementNode("expressionStatement", expression); @@ -448,7 +440,6 @@ public boolean visit(ExpressionStatement node) { @Override public boolean visit(FieldAccess node) { - IValue expression = visitChild(node.getExpression()); IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -459,7 +450,6 @@ public boolean visit(FieldAccess node) { @Override public boolean visit(FieldDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node); IValue type = visitChild(node.getType()); @@ -476,7 +466,6 @@ public boolean visit(FieldDeclaration node) { @Override public boolean visit(ForStatement node) { - IListWriter initializers = values.listWriter(); for (Iterator it = node.initializers().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); @@ -500,7 +489,6 @@ public boolean visit(ForStatement node) { @Override public boolean visit(IfStatement node) { - IValue booleanExpression = visitChild(node.getExpression()); IValue thenStatement = visitChild(node.getThenStatement()); IValue elseStatement = node.getElseStatement() == null ? null : visitChild(node.getElseStatement()); @@ -531,7 +519,6 @@ public boolean visit(ImportDeclaration node) { @Override public boolean visit(InfixExpression node) { - IValue operator = values.string(node.getOperator().toString()); IValue leftSide = visitChild(node.getLeftOperand()); IValue rightSide = visitChild(node.getRightOperand()); @@ -549,7 +536,6 @@ public boolean visit(InfixExpression node) { @Override public boolean visit(Initializer node) { - IList extendedModifiers = parseExtendedModifiers(node); IValue body = visitChild(node.getBody()); @@ -560,7 +546,6 @@ public boolean visit(Initializer node) { @Override public boolean visit(InstanceofExpression node) { - IValue leftSide = visitChild(node.getLeftOperand()); IValue rightSide = visitChild(node.getRightOperand()); @@ -571,13 +556,11 @@ public boolean visit(InstanceofExpression node) { @Override public boolean visit(Javadoc node) { - return false; } @Override public boolean visit(LabeledStatement node) { - IValue label = values.string(node.getLabel().getFullyQualifiedName()); IValue body = visitChild(node.getBody()); @@ -588,13 +571,11 @@ public boolean visit(LabeledStatement node) { @Override public boolean visit(LineComment node) { - return false; } @Override public boolean visit(MarkerAnnotation node) { - IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); ownValue = constructExpressionNode("markerAnnotation", typeName); @@ -608,7 +589,6 @@ public boolean visit(MemberRef node) { @Override public boolean visit(MemberValuePair node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); IValue value = visitChild(node.getValue()); @@ -640,7 +620,6 @@ public boolean visit(MethodDeclaration node) { returnType = visitChild(node.getReturnType2()); } else { - returnType = constructTypeNode("void"); } } else { @@ -689,7 +668,6 @@ public boolean visit(MethodDeclaration node) { @Override public boolean visit(MethodInvocation node) { - IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); IListWriter genericTypes = values.listWriter(); @@ -735,7 +713,6 @@ public boolean visit(Modifier node) { @Override public boolean visit(NormalAnnotation node) { - IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); IListWriter memberValuePairs = values.listWriter(); @@ -751,7 +728,6 @@ public boolean visit(NormalAnnotation node) { @Override public boolean visit(NullLiteral node) { - ownValue = constructExpressionNode("null"); return false; @@ -759,7 +735,6 @@ public boolean visit(NullLiteral node) { @Override public boolean visit(NumberLiteral node) { - IValue number = values.string(node.getToken()); ownValue = constructExpressionNode("number", number); @@ -787,7 +762,6 @@ public boolean visit(PackageDeclaration node) { @Override public boolean visit(ParameterizedType node) { - IValue type = visitChild(node.getType()); IListWriter genericTypes = values.listWriter(); @@ -803,7 +777,6 @@ public boolean visit(ParameterizedType node) { @Override public boolean visit(ParenthesizedExpression node) { - IValue expression = visitChild(node.getExpression()); ownValue = constructExpressionNode("bracket", expression); @@ -812,7 +785,6 @@ public boolean visit(ParenthesizedExpression node) { @Override public boolean visit(PostfixExpression node) { - IValue operand = visitChild(node.getOperand()); IValue operator = values.string(node.getOperator().toString()); @@ -823,7 +795,6 @@ public boolean visit(PostfixExpression node) { @Override public boolean visit(PrefixExpression node) { - IValue operand = visitChild(node.getOperand()); IValue operator = values.string(node.getOperator().toString()); @@ -841,7 +812,6 @@ public boolean visit(PrimitiveType node) { @Override public boolean visit(QualifiedName node) { - IValue qualifier = visitChild(node.getQualifier()); @@ -866,7 +836,6 @@ public boolean visit(QualifiedType node) { @Override public boolean visit(ReturnStatement node) { - IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); ownValue = constructStatementNode("return", expression); @@ -875,7 +844,6 @@ public boolean visit(ReturnStatement node) { @Override public boolean visit(SimpleName node) { - IValue value = values.string(node.getFullyQualifiedName()); ownValue = constructExpressionNode("simpleName", value); @@ -893,7 +861,6 @@ public boolean visit(SimpleType node) { @Override public boolean visit(SingleMemberAnnotation node) { - IValue name = values.string(node.getTypeName().getFullyQualifiedName()); IValue value = visitChild(node.getValue()); @@ -904,7 +871,6 @@ public boolean visit(SingleMemberAnnotation node) { @Override public boolean visit(SingleVariableDeclaration node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); IList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -923,7 +889,6 @@ public boolean visit(SingleVariableDeclaration node) { @Override public boolean visit(StringLiteral node) { - IString escaped = values.string(node.getEscapedValue()); IString literal = values.string(node.getLiteralValue()); ownValue = constructExpressionNode("stringLiteral", escaped).asWithKeywordParameters().setParameter("literal", literal); @@ -978,7 +943,6 @@ public boolean visit(SwitchExpression node) { @Override public boolean visit(SuperConstructorInvocation node) { - IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); IListWriter genericTypes = values.listWriter(); @@ -1004,7 +968,6 @@ public boolean visit(SuperConstructorInvocation node) { @Override public boolean visit(SuperFieldAccess node) { - IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); IValue name = values.string((node.getName().getFullyQualifiedName())); @@ -1015,7 +978,6 @@ public boolean visit(SuperFieldAccess node) { @Override public boolean visit(SuperMethodInvocation node) { - IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); IListWriter genericTypes = values.listWriter(); @@ -1205,7 +1167,6 @@ public boolean visit(SwitchStatement node) { @Override public boolean visit(SynchronizedStatement node) { - IValue expression = visitChild(node.getExpression()); IValue body = visitChild(node.getBody()); @@ -1216,19 +1177,20 @@ public boolean visit(SynchronizedStatement node) { @Override public boolean visit(TagElement node) { - // TODO: what should be added here? + // These are recognized elements in JavaDoc code such as @see and @link. + // We currently skip parsing those parts of the syntax so we return nothing here. return false; } @Override public boolean visit(TextElement node) { - // TODO: what should happen here? + // These are recognized elements in JavaDoc code such as @see and @link. + // We currently skip parsing those parts of the syntax so we return nothing here. return false; } @Override public boolean visit(ThisExpression node) { - IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); ownValue = constructExpressionNode("this", qualifier); @@ -1238,7 +1200,6 @@ public boolean visit(ThisExpression node) { @Override public boolean visit(ThrowStatement node) { - IValue expression = visitChild(node.getExpression()); ownValue = constructStatementNode("throw", expression); @@ -1248,7 +1209,6 @@ public boolean visit(ThrowStatement node) { @Override public boolean visit(TryStatement node) { - IValue body = visitChild(node.getBody()); IListWriter catchClauses = values.listWriter(); @@ -1266,7 +1226,6 @@ public boolean visit(TryStatement node) { @Override public boolean visit(TypeDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node); String objectType = node.isInterface() ? "interface" : "class"; IValue name = values.string(node.getName().getFullyQualifiedName()); @@ -1320,8 +1279,8 @@ public boolean visit(TypeDeclaration node) { @Override public boolean visit(TypeDeclarationStatement node) { - IValue typeDeclaration; + if (node.getAST().apiLevel() == AST.JLS2) { typeDeclaration = visitChild(node.getTypeDeclaration()); } @@ -1336,7 +1295,6 @@ public boolean visit(TypeDeclarationStatement node) { @Override public boolean visit(TypeLiteral node) { - IValue type = visitChild(node.getType()); ownValue = constructExpressionNode("type", type); @@ -1346,7 +1304,6 @@ public boolean visit(TypeLiteral node) { @Override public boolean visit(TypeParameter node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); IListWriter extendsList = values.listWriter(); @@ -1364,7 +1321,6 @@ public boolean visit(TypeParameter node) { @Override public boolean visit(UnionType node) { - IListWriter typesValues = values.listWriter(); for(Iterator types = node.types().iterator(); types.hasNext();) { Type type = (Type) types.next(); @@ -1378,7 +1334,6 @@ public boolean visit(UnionType node) { @Override public boolean visit(IntersectionType node) { - IListWriter typesValues = values.listWriter(); for(Iterator types = node.types().iterator(); types.hasNext();) { Type type = (Type) types.next(); @@ -1392,7 +1347,6 @@ public boolean visit(IntersectionType node) { @Override public boolean visit(VariableDeclarationExpression node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -1415,7 +1369,6 @@ public boolean visit(VariableDeclarationExpression node) { @Override public boolean visit(VariableDeclarationFragment node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); @@ -1428,7 +1381,6 @@ public boolean visit(VariableDeclarationFragment node) { @Override public boolean visit(VariableDeclarationStatement node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); From 61cd5815219229f88a62b528f7827eeed9e1f5f8 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 14:25:57 +0200 Subject: [PATCH 024/134] added module as a type for Java and fixed naming issues in the AST format. Also documented analysis::m3::AST better --- src/org/rascalmpl/library/analysis/m3/AST.rsc | 77 +++++++++++++++---- .../library/analysis/m3/TypeSymbol.rsc | 4 +- .../rascalmpl/library/lang/java/m3/AST.rsc | 18 ++--- .../library/lang/java/m3/TypeSymbol.rsc | 1 + .../lang/java/m3/internal/ASTConverter.java | 4 + .../java/m3/internal/BindingsResolver.java | 50 ++++++++---- 6 files changed, 115 insertions(+), 39 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/AST.rsc b/src/org/rascalmpl/library/analysis/m3/AST.rsc index a87c7afdd36..b8eab247d3e 100644 --- a/src/org/rascalmpl/library/analysis/m3/AST.rsc +++ b/src/org/rascalmpl/library/analysis/m3/AST.rsc @@ -16,7 +16,9 @@ The concept of _declaration_ is also relevant. A `decl` annotation points from a Finally, the concept of a _type_ is relevant for ASTs. In particular an `Expression` may have a `typ` annotation, or a variable declaration, etc. } @benefits{ -* Symbolic abstract syntax trees can be analyzed and transformed easily using Rascal primitives such as patterns, comprehensions and visit. +* Symbolic abstract syntax trees can be analyzed and transformed easily using Rascal primitives such as patterns, comprehensions and visit. +* By re-using recognizable names for different programming languages, it's easier to switch between languages to analyze. +* Some algorithms made be reusable on different programming languages, but please be aware of the _pitfalls_. } @pitfalls{ * Even though different languages may map to the same syntactic construct, this does not mean that the semantics is the same. Downstream @@ -28,41 +30,86 @@ import Message; import Node; import analysis::m3::TypeSymbol; +@synopsis{For metric purposes we can use a true AST declaration tree, a simple list of lines for generic metrics, or the reason why we do not have an AST.} data \AST(loc file = |unknown:///|) = declaration(Declaration declaration) | lines(list[str] contents) | noAST(Message msg) ; - -loc unknownSource = |unknown:///|; -loc unresolvedDecl = |unresolved:///|; -loc unresolvedType = |unresolved:///|; +@synopsis{Uniform name for everything that is declared in programming languages: variables, functions, classes, etc.} +@description{ +Instances of the Declaration type represent the _syntax_ of declarations in programming languages. + +| field name | description | +| ---------- | ----------- | +| `src` | the exact source location of the declaration in a source file | +| `decl` | the resolved fully qualified name of the artefact that is being declared here | +| `typ` | a symbolic representation of the static type of the declared artefact here (not the syntax of the type) | +} data Declaration( loc src = |unknown:///|, - loc decl = |unresolved:///|, //unresolvedDecl - TypeSymbol typ = \any(), - list[Modifier] modifiers = [], - list[Message] messages = [] + loc decl = |unresolved:///|, + TypeSymbol typ = unresolved() ); +@synopsis{Uniform name for everything that is typicall a _statement_ programming languages: assignment, loops, conditionals, jumps} +@description{ +Instances of the Statement type represent the _syntax_ of statements in programming languages. + +| field name | description | +| ---------- | ----------- | +| `src` | the exact source location of the statement in a source file | +| `decl` | if the statement directly represent a usage of a declared artefact, then this points to the fully qualified name of the used artifact. +} data Statement( loc src = |unknown:///|, - loc decl = |unresolved:///| //unresolvedDecl + loc decl = |unresolved:///| ); +@synopsis{Uniform name for everything that is an _expression_ in programming languages: arithmetic, comparisons, function invocations, ...} +@description{ +Instances of the Expression type represent the _syntax_ of expressions in programming languages. + +| field name | description | +| ---------- | ----------- | +| `src` | the exact source location of the expression in a source file | +| `decl` | if this expression represents a usage, decl is the resolved fully qualified name of the artefact that is being used here | +| `typ` | a symbolic representation of the static type of the _result_ of the expression | +} data Expression( loc src = |unknown:///|, - loc decl = |unresolved:///|, //unresolvedDecl, - TypeSymbol typ = \any() + loc decl = |unresolved:///|, + TypeSymbol typ = \unresolved() ); +@synopsis{Uniform name for everything that is an _type_ in programming languages syntax: int, void, List, ...} +@description{ +Instances of the Type type represent the _syntax_ of types in programming languages. + +| field name | description | +| ---------- | ----------- | +| `src` | the exact source location of the expression in a source file | +| `decl` | the fully qualified name of the type, if resolved and if well-defined | +| `typ` | a symbolic representation of the static type that is the meaning of this type expression | +} data Type( - loc name = |unresolved:///|, //unresolvedType, - TypeSymbol typ = \any() + loc src = |unknown:///|, + loc decl = |unresolved:///|, + TypeSymbol typ = \unresolved() ); -data Modifier; +@synopsis{Uniform name for everything that is a _modifier_ in programming languages syntax: public, static, final, etc.} +@description{ +Instances of the Modifer type represent the _syntax_ of modifiers in programming languages. + +| field name | description | +| ---------- | ----------- | +| `src` | the exact source location of the expression in a source file | +} +data Modifier( + loc src = |unknown:///| +); @synopsis{Test for the consistency characteristics of an M3 annotated abstract syntax tree} bool astNodeSpecification(node n, str language = "java", bool checkNameResolution=false, bool checkSourceLocation=true) { diff --git a/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc b/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc index 3be65690048..c8884ac4970 100644 --- a/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc +++ b/src/org/rascalmpl/library/analysis/m3/TypeSymbol.rsc @@ -30,5 +30,7 @@ because the subtype and lub functions of the two languages will merge. } module analysis::m3::TypeSymbol -data TypeSymbol; +data TypeSymbol + = unresolved() + ; diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 70cadd564a3..1a11110a49c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -85,19 +85,19 @@ data Expression(TypeSymbol typ=\unresolved()) | \newObject(Type \type, list[Expression] args) | \qualifiedName(Expression qualifier, Expression expression) | \conditional(Expression expression, Expression thenBranch, Expression elseBranch) - | \fieldAccess(bool isSuper, Expression expression, str name) - | \fieldAccess(bool isSuper, str name) + | \fieldAccess(bool isSuper, Expression expression, str identifier) + | \fieldAccess(bool isSuper, str identifier) | \instanceof(Expression leftSide, Type rightSide) - | \methodCall(bool isSuper, str name, list[Expression] arguments) - | \methodCall(bool isSuper, Expression receiver, str name, list[Expression] arguments) + | \methodCall(bool isSuper, str identifier, list[Expression] arguments) + | \methodCall(bool isSuper, Expression receiver, str identifier, list[Expression] arguments) | \null() | \number(str numberValue) | \booleanLiteral(bool boolValue) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) - | \variable(str name, int extraDimensions) - | \variable(str name, int extraDimensions, Expression \initializer) + | \variable(str identifier, int extraDimensions) + | \variable(str identifier, int extraDimensions, Expression \initializer) | \bracket(Expression expression) | \this() | \this(Expression thisExpression) @@ -106,14 +106,14 @@ data Expression(TypeSymbol typ=\unresolved()) | \infix(Expression lhs, str operator, Expression rhs) | \postfix(Expression operand, str operator) | \prefix(str operator, Expression operand) - | \simpleName(str name) + | \simpleName(str identifier) | \switch(Expression expression, list[Statement] cases) | \markerAnnotation(str typeName) | \methodReference(Type \type, list[Type] typeArguments, Expression name) | \methodReference(Expression expression, list[Type] typeArguments, Expression name) | \superMethodReference(list[Type] typeArguments, Expression name) | \normalAnnotation(str typeName, list[Expression] memberValuePairs) - | \memberValuePair(str name, Expression \value) + | \memberValuePair(str identifier, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) | \lambda(list[Declaration] parameters, Statement block) | \lambda(list[Declaration] parameters, Expression body) @@ -134,7 +134,7 @@ data Statement | \for(list[Expression] initializers, list[Expression] updaters, Statement body) | \if(Expression condition, Statement thenBranch) | \if(Expression condition, Statement thenBranch, Statement elseBranch) - | \label(str name, Statement body) + | \label(str identifier, Statement body) | \return(Expression expression) | \return() | \switch(Expression expression, list[Statement] statements) diff --git a/src/org/rascalmpl/library/lang/java/m3/TypeSymbol.rsc b/src/org/rascalmpl/library/lang/java/m3/TypeSymbol.rsc index 3680c70ab98..3b7d35b38ee 100644 --- a/src/org/rascalmpl/library/lang/java/m3/TypeSymbol.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/TypeSymbol.rsc @@ -34,6 +34,7 @@ data TypeSymbol | \array(TypeSymbol component, int dimension) | \typeVariable(loc decl) | \unresolved() + | \module(loc decl) ; default bool subtype(TypeSymbol s, TypeSymbol t) = s == t; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 773282e2d2d..45500222d44 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -65,6 +65,10 @@ else if (node instanceof VariableDeclaration) { IVariableBinding binding = ((VariableDeclaration) node).resolveBinding(); return bindingsResolver.resolveType(binding.getType(), false); } + else if (node instanceof ModuleDeclaration) { + IModuleBinding binding = ((ModuleDeclaration) node).resolveBinding(); + return bindingsResolver.resolveType(binding, true); + } } catch (NullPointerException e) { System.err.println("Got NPE for node " + node + ((e.getStackTrace().length > 0) ? ("\n\t" + e.getStackTrace()[0]) : "")); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java index 53cf20d2cbe..30eb4ce8182 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java @@ -27,6 +27,7 @@ import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.IModuleBinding; import org.eclipse.jdt.core.dom.IPackageBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; @@ -243,17 +244,24 @@ private ISourceLocation resolveInitializer(Initializer node) { public ISourceLocation resolveBinding(IBinding binding) { if (binding == null) { - return makeBinding("unresolved", null, null); + return makeBinding("unresolved", null, null); } if (binding instanceof ITypeBinding) { - return resolveBinding((ITypeBinding) binding); - } else if (binding instanceof IMethodBinding) { - return resolveBinding((IMethodBinding) binding); - } else if (binding instanceof IPackageBinding) { - return resolveBinding((IPackageBinding) binding); - } else if (binding instanceof IVariableBinding) { - return resolveBinding((IVariableBinding) binding); + return resolveBinding((ITypeBinding) binding); + } + else if (binding instanceof IMethodBinding) { + return resolveBinding((IMethodBinding) binding); + } + else if (binding instanceof IPackageBinding) { + return resolveBinding((IPackageBinding) binding); + } + else if (binding instanceof IVariableBinding) { + return resolveBinding((IVariableBinding) binding); } + else if (binding instanceof IModuleBinding) { + return makeBinding("java+module", "", ((IModuleBinding) binding).getName()); + } + return makeBinding("unknown", null, null); } @@ -265,12 +273,17 @@ public IConstructor resolveType(IBinding binding, boolean isDeclaration) { if (binding != null) { ISourceLocation uri = resolveBinding(binding); if (binding instanceof ITypeBinding) { - return computeTypeSymbol(uri, (ITypeBinding) binding, isDeclaration); - } else if (binding instanceof IMethodBinding) { - return computeMethodTypeSymbol(uri, (IMethodBinding) binding, isDeclaration); - } else if (binding instanceof IVariableBinding) { - return resolveType(((IVariableBinding) binding).getType(), isDeclaration); + return computeTypeSymbol(uri, (ITypeBinding) binding, isDeclaration); + } + else if (binding instanceof IMethodBinding) { + return computeMethodTypeSymbol(uri, (IMethodBinding) binding, isDeclaration); + } + else if (binding instanceof IVariableBinding) { + return resolveType(((IVariableBinding) binding).getType(), isDeclaration); } + else if (binding instanceof IModuleBinding) { + return computeTypeSymbol(uri); + } } return result; } @@ -340,7 +353,11 @@ private IConstructor unresolvedSym() { private Set wildCardBoundsVisited = new HashSet<>(); - private IConstructor computeTypeSymbol(ISourceLocation decl, ITypeBinding binding, boolean isDeclaration) { + private IConstructor computeTypeSymbol(ISourceLocation decl) { + return moduleSymbol(decl); + } + + private IConstructor computeTypeSymbol(ISourceLocation decl, ITypeBinding binding, boolean isDeclaration) { if (binding.isPrimitive()) { return primitiveSymbol(binding.getName()); } @@ -467,6 +484,11 @@ private IConstructor primitiveSymbol(String name) { return values.constructor(cons); } + private IConstructor moduleSymbol(ISourceLocation name) { + io.usethesource.vallang.type.Type cons = store.lookupConstructor(getTypeSymbol(), "module", tf.sourceLocationType()); + return values.constructor(cons, name); + } + private IConstructor arraySymbol(IConstructor elem, int dimensions) { io.usethesource.vallang.type.Type cons = store.lookupConstructor(getTypeSymbol(), "array", tf.tupleType(elem.getType(), tf.integerType())); return values.constructor(cons, elem, values.integer(dimensions)); From 4a11698a59ea8a92d45927b3efacc36aeb507471 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 14:30:27 +0200 Subject: [PATCH 025/134] fixed field access --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 4 ++-- .../library/lang/java/m3/internal/ASTConverter.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 1a11110a49c..9e3e4493e95 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -85,8 +85,8 @@ data Expression(TypeSymbol typ=\unresolved()) | \newObject(Type \type, list[Expression] args) | \qualifiedName(Expression qualifier, Expression expression) | \conditional(Expression expression, Expression thenBranch, Expression elseBranch) - | \fieldAccess(bool isSuper, Expression expression, str identifier) - | \fieldAccess(bool isSuper, str identifier) + | \fieldAccess(Expression expression, Expression name) + | \superFieldAccess(Expression expression, Expression name) | \instanceof(Expression leftSide, Type rightSide) | \methodCall(bool isSuper, str identifier, list[Expression] arguments) | \methodCall(bool isSuper, Expression receiver, str identifier, list[Expression] arguments) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 45500222d44..573bf39787d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -445,9 +445,9 @@ public boolean visit(ExpressionStatement node) { @Override public boolean visit(FieldAccess node) { IValue expression = visitChild(node.getExpression()); - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); - ownValue = constructExpressionNode("fieldAccess", values.bool(false), expression, name); + ownValue = constructExpressionNode("fieldAccess", expression, name); return false; } @@ -973,9 +973,9 @@ public boolean visit(SuperConstructorInvocation node) { @Override public boolean visit(SuperFieldAccess node) { IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); - IValue name = values.string((node.getName().getFullyQualifiedName())); + IValue name = visitChild(node.getName()); - ownValue = constructExpressionNode("fieldAccess", values.bool(true), qualifier, name); + ownValue = constructExpressionNode("fieldAccess", qualifier, name); return false; } From 92f104d2c0a9fa3a6dc95a9d2fe89ae57f061a6c Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 15:36:28 +0200 Subject: [PATCH 026/134] rationalized all shortcuts of `str` to Expression for better resolution and more uniformity --- .../rascalmpl/library/lang/java/m3/AST.rsc | 41 +++++++-------- .../lang/java/m3/internal/ASTConverter.java | 52 ++++++++++--------- 2 files changed, 48 insertions(+), 45 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 9e3e4493e95..1947178128e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -36,28 +36,27 @@ data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) | \compilationUnit(Declaration \module) | \compilationUnit(Declaration package, list[Declaration] imports, list[Declaration] types) - | \enum(str name, list[Type] implements, list[Declaration] constants, list[Declaration] body) - | \enumConstant(str name, list[Expression] arguments, Declaration class) - | \enumConstant(str name, list[Expression] arguments) - | \class(str name, list[Type] extends, list[Type] implements, list[Declaration] body) + | \enum(Expression name, list[Type] implements, list[Declaration] constants, list[Declaration] body) + | \enumConstant(Expression name, list[Expression] arguments, Declaration class) + | \enumConstant(Expression name, list[Expression] arguments) + | \class(Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) | \class(list[Declaration] body) - | \interface(str name, list[Type] extends, list[Type] implements, list[Declaration] body) + | \interface(Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) | \field(Type \type, list[Expression] fragments) | \initializer(Statement initializerBody) - | \method(Type \return, str name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) - | \method(Type \return, str name, list[Declaration] parameters, list[Expression] exceptions) - | \constructor(str name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) - | \import(str name) - | \package(str name) - | \package(Declaration parentPackage, str name) + | \method(Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) + | \method(Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) + | \constructor(Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) + | \import(Expression name) + | \package(Expression name) | \variables(Type \type, list[Expression] \fragments) - | \typeParameter(str name, list[Type] extendsList) - | \annotationType(str name, list[Declaration] body) - | \annotationTypeMember(Type \type, str name) - | \annotationTypeMember(Type \type, str name, Expression defaultBlock) + | \typeParameter(Expression name, list[Type] extendsList) // TODO: this seems unused at the moment, relation to wildcard, super/extends unknown + | \annotationType(Expression name, list[Declaration] body) + | \annotationTypeMember(Type \type, Expression name) + | \annotationTypeMember(Type \type, Expression name, Expression defaultBlock) // initializers missing in parameter, is it needed in vararg? - | \parameter(Type \type, str name, int extraDimensions) - | \vararg(Type \type, str name) + | \parameter(Type \type, Expression name, int extraDimensions) + | \vararg(Type \type, Expression name) ; @synopsis{These declarations types are related to the Java 9 module system} @@ -88,16 +87,16 @@ data Expression(TypeSymbol typ=\unresolved()) | \fieldAccess(Expression expression, Expression name) | \superFieldAccess(Expression expression, Expression name) | \instanceof(Expression leftSide, Type rightSide) - | \methodCall(bool isSuper, str identifier, list[Expression] arguments) - | \methodCall(bool isSuper, Expression receiver, str identifier, list[Expression] arguments) + | \methodCall(Expression receiver, str identifier, list[Expression] arguments) + | \superMethodCall(Expression receiver, str identifier, list[Expression] arguments) | \null() | \number(str numberValue) | \booleanLiteral(bool boolValue) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) - | \variable(str identifier, int extraDimensions) - | \variable(str identifier, int extraDimensions, Expression \initializer) + | \variable(str identifier, int extraDimensions) // TODO: an int is not syntax + | \variable(str identifier, int extraDimensions, Expression \initializer) // TODO: an int is not syntax | \bracket(Expression expression) | \this() | \this(Expression thisExpression) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 573bf39787d..68d2966009e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -80,7 +80,7 @@ else if (node instanceof ModuleDeclaration) { @Override public boolean visit(AnnotationTypeDeclaration node) { IList extendedModifiers = parseExtendedModifiers(node.modifiers()); - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter bodyDeclarations = values.listWriter(); for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { @@ -98,10 +98,10 @@ public boolean visit(AnnotationTypeMemberDeclaration node) { IList extendedModifiers = parseExtendedModifiers(node.modifiers()); IValue typeArgument = visitChild(node.getType()); - String name = node.getName().getFullyQualifiedName(); + IValue name = visitChild(node.getName()); IValue defaultBlock = node.getDefault() == null ? null : visitChild(node.getDefault()); - ownValue = constructDeclarationNode("annotationTypeMember", typeArgument, values.string(name), defaultBlock); + ownValue = constructDeclarationNode("annotationTypeMember", typeArgument, name, defaultBlock); setKeywordParameters("modifiers", extendedModifiers); return false; } @@ -385,7 +385,7 @@ public boolean visit(EnhancedForStatement node) { @Override public boolean visit(EnumConstantDeclaration node) { IList extendedModifiers = parseExtendedModifiers(node.modifiers()); - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); if (!node.arguments().isEmpty()) { @@ -504,7 +504,7 @@ public boolean visit(IfStatement node) { @Override public boolean visit(ImportDeclaration node) { - String name = node.getName().getFullyQualifiedName(); + IValue name = visitChild(node.getName()); IListWriter importModifiers = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { @@ -515,7 +515,7 @@ public boolean visit(ImportDeclaration node) { importModifiers.append(constructModifierNode("onDemand")); } - ownValue = constructDeclarationNode("import", values.string(name)); + ownValue = constructDeclarationNode("import", name); setKeywordParameters("modifiers", importModifiers.done()); return false; @@ -630,7 +630,7 @@ public boolean visit(MethodDeclaration node) { constructorName = "constructor"; } - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter parameters = values.listWriter(); for (Iterator it = node.parameters().iterator(); it.hasNext();) { @@ -684,7 +684,7 @@ public boolean visit(MethodInvocation node) { } } - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { @@ -692,7 +692,7 @@ public boolean visit(MethodInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("methodCall", values.bool(false), expression, name, arguments.done()); + ownValue = constructExpressionNode("methodCall", expression, name, arguments.done()); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -750,16 +750,20 @@ public boolean visit(NumberLiteral node) { public boolean visit(PackageDeclaration node) { IList annotations = parseExtendedModifiers(node.annotations()); - ownValue = null; - for (String component: node.getName().getFullyQualifiedName().split("\\.")) { - if (ownValue == null) { - ownValue = constructDeclarationNode("package", values.string(component)); - setKeywordParameter("decl", resolveBinding(component)); - continue; - } - ownValue = constructDeclarationNode("package", ownValue, values.string(component)); - setKeywordParameter("decl", resolveBinding(component)); - } + IValue name = visitChild(node.getName()); + ownValue = constructDeclarationNode("package", name); + + // TODO: check if this commented code is indeed replacable by the above + // ownValue = null; + // for (String component: node.getName().getFullyQualifiedName().split("\\.")) { + // if (ownValue == null) { + // ownValue = constructDeclarationNode("package", values.string(component)); + // setKeywordParameter("decl", resolveBinding(component)); + // continue; + // } + // ownValue = constructDeclarationNode("package", ownValue, values.string(component)); + // setKeywordParameter("decl", resolveBinding(component)); + // } setKeywordParameters("modifiers", annotations); return false; } @@ -875,7 +879,7 @@ public boolean visit(SingleMemberAnnotation node) { @Override public boolean visit(SingleVariableDeclaration node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IList extendedModifiers = parseExtendedModifiers(node.modifiers()); @@ -994,7 +998,7 @@ public boolean visit(SuperMethodInvocation node) { } } - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { @@ -1002,7 +1006,7 @@ public boolean visit(SuperMethodInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("methodCall", values.bool(true), qualifier, name, arguments.done()); + ownValue = constructExpressionNode("superMethodCall", qualifier, name, arguments.done()); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -1232,7 +1236,7 @@ public boolean visit(TryStatement node) { public boolean visit(TypeDeclaration node) { IList extendedModifiers = parseExtendedModifiers(node); String objectType = node.isInterface() ? "interface" : "class"; - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { @@ -1308,7 +1312,7 @@ public boolean visit(TypeLiteral node) { @Override public boolean visit(TypeParameter node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter extendsList = values.listWriter(); if (!node.typeBounds().isEmpty()) { From 06236ece2d9871b45a42f6c2c022d703bbd8aed9 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 15:37:54 +0200 Subject: [PATCH 027/134] removed illegal bool value from AST definition --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 2 +- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 1947178128e..45c93a0d615 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -91,7 +91,7 @@ data Expression(TypeSymbol typ=\unresolved()) | \superMethodCall(Expression receiver, str identifier, list[Expression] arguments) | \null() | \number(str numberValue) - | \booleanLiteral(bool boolValue) + | \booleanLiteral(str boolValue) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 68d2966009e..414410224ee 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -208,7 +208,7 @@ public boolean visit(BlockComment node) { @Override public boolean visit(BooleanLiteral node) { - IValue booleanValue = values.bool(node.booleanValue()); + IValue booleanValue = values.string(Boolean.toString(node.booleanValue())); ownValue = constructExpressionNode("booleanLiteral", booleanValue); From e72f1b6da0c8d295c4232eb0ef2f41c885ad3d5c Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 16:51:04 +0200 Subject: [PATCH 028/134] added all missing AST nodes for modifiers and annotations aback into Java\'s AST format, and fixed the mapping to accomodate --- .../rascalmpl/library/lang/java/m3/AST.rsc | 48 +++--- .../lang/java/m3/internal/ASTConverter.java | 150 +++++++++++------- .../m3/internal/JavaToRascalConverter.java | 33 +++- 3 files changed, 146 insertions(+), 85 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 45c93a0d615..0bf40b06f58 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -36,27 +36,27 @@ data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) | \compilationUnit(Declaration \module) | \compilationUnit(Declaration package, list[Declaration] imports, list[Declaration] types) - | \enum(Expression name, list[Type] implements, list[Declaration] constants, list[Declaration] body) - | \enumConstant(Expression name, list[Expression] arguments, Declaration class) - | \enumConstant(Expression name, list[Expression] arguments) - | \class(Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) - | \class(list[Declaration] body) - | \interface(Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) - | \field(Type \type, list[Expression] fragments) - | \initializer(Statement initializerBody) - | \method(Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) - | \method(Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) - | \constructor(Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) + | \enum(list[Modifier] modifiers, Expression name, list[Type] implements, list[Declaration] constants, list[Declaration] body) + | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments, Declaration class) + | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments) + | \class(list[Modifier] modifiers, Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) + | \class(list[Modifier] modifiers, list[Declaration] body) + | \interface(list[Modifier] modifiers, Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) + | \field(list[Modifier] modifiers, Type \type, list[Expression] fragments) + | \initializer(list[Modifier] modifiers, Statement initializerBody) + | \method(list[Modifier] modifiers, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) + | \method(list[Modifier] modifiers, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) + | \constructor(list[Modifier] modifiers, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) | \import(Expression name) - | \package(Expression name) - | \variables(Type \type, list[Expression] \fragments) + | \package(list[Modifier] modifiers, Expression name) + | \variables(list[Modifier] modifiers, Type \type, list[Expression] \fragments) | \typeParameter(Expression name, list[Type] extendsList) // TODO: this seems unused at the moment, relation to wildcard, super/extends unknown - | \annotationType(Expression name, list[Declaration] body) - | \annotationTypeMember(Type \type, Expression name) - | \annotationTypeMember(Type \type, Expression name, Expression defaultBlock) + | \annotationType(list[Modifier] modifiers, Expression name, list[Declaration] body) + | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name) + | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name, Expression defaultBlock) // initializers missing in parameter, is it needed in vararg? - | \parameter(Type \type, Expression name, int extraDimensions) - | \vararg(Type \type, Expression name) + | \parameter(list[Modifier] modifiers, Type \type, Expression name, int extraDimensions) + | \vararg(list[Modifier] modifiers, Type \type, Expression name) ; @synopsis{These declarations types are related to the Java 9 module system} @@ -107,12 +107,12 @@ data Expression(TypeSymbol typ=\unresolved()) | \prefix(str operator, Expression operand) | \simpleName(str identifier) | \switch(Expression expression, list[Statement] cases) - | \markerAnnotation(str typeName) + | \markerAnnotation(Expression name) | \methodReference(Type \type, list[Type] typeArguments, Expression name) | \methodReference(Expression expression, list[Type] typeArguments, Expression name) | \superMethodReference(list[Type] typeArguments, Expression name) - | \normalAnnotation(str typeName, list[Expression] memberValuePairs) - | \memberValuePair(str identifier, Expression \value) + | \normalAnnotation(Expression name, list[Expression] memberValuePairs) + | \memberValuePair(Expression name, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) | \lambda(list[Declaration] parameters, Statement block) | \lambda(list[Declaration] parameters, Expression body) @@ -148,8 +148,10 @@ data Statement | \declarationStatement(Declaration declaration) | \while(Expression condition, Statement body) | \expressionStatement(Expression stmt) - | \constructorCall(bool isSuper, Expression expr, list[Expression] arguments) - | \constructorCall(bool isSuper, list[Expression] arguments) + | \constructorCall(Expression expr, list[Expression] arguments) + | \constructorCall(list[Expression] arguments) + | \superConstructorCall(Expression expr, list[Expression] arguments) + | \superConstructorCall(list[Expression] arguments) | \yield(Expression argument) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 414410224ee..a75c3526ce5 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1,9 +1,12 @@ package org.rascalmpl.library.lang.java.m3.internal; +import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; +import org.eclipse.jdt.core.IAnnotatable; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.*; import io.usethesource.vallang.IList; @@ -70,6 +73,7 @@ else if (node instanceof ModuleDeclaration) { return bindingsResolver.resolveType(binding, true); } } catch (NullPointerException e) { + // TODO: log this in a better way System.err.println("Got NPE for node " + node + ((e.getStackTrace().length > 0) ? ("\n\t" + e.getStackTrace()[0]) : "")); } @@ -77,9 +81,47 @@ else if (node instanceof ModuleDeclaration) { } + @Override + public void preVisit(ASTNode node) { + // since many many nodes have annotatable possibilities, this factors + // out the AST construction code of all of those visit methods. + // Still every such method must put the ownAnnotations list at the right place in their constructor. + + if (node instanceof IAnnotatable) { + IAnnotatable annotable = (IAnnotatable) node; + + try { + ownAnnotations = Arrays.stream(annotable.getAnnotations()) + .map(o -> (ASTNode) o) + .map(a -> visitChild(a)) + .collect(values.listWriter()); + } + catch (JavaModelException e) { + // TODO: log this in a better way + System.err.println("Unhandled internal error: " + e.getMessage()); + } + } + else { + ownAnnotations = null; + } + + // many nodes also have modifiers + List modifiers = (List) node.getProperty("modifiers"); + if (modifiers != null) { + ownModifiers = modifiers.stream() + .map(o -> (ASTNode) o) + .map(a -> visitChild(a)) + .collect(values.listWriter()); + } + else { + ownModifiers = null; + } + } + + @Override public boolean visit(AnnotationTypeDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue name = visitChild(node.getName()); IListWriter bodyDeclarations = values.listWriter(); @@ -88,21 +130,21 @@ public boolean visit(AnnotationTypeDeclaration node) { bodyDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode("annotationType", name, bodyDeclarations.done()); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode("annotationType", modifiers, name, bodyDeclarations.done()); + return false; } @Override public boolean visit(AnnotationTypeMemberDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue typeArgument = visitChild(node.getType()); IValue name = visitChild(node.getName()); IValue defaultBlock = node.getDefault() == null ? null : visitChild(node.getDefault()); - ownValue = constructDeclarationNode("annotationTypeMember", typeArgument, name, defaultBlock); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode("annotationTypeMember", modifiers, typeArgument, name, defaultBlock); + return false; } @@ -340,7 +382,7 @@ public boolean visit(ConstructorInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructStatementNode("constructorCall", values.bool(false), arguments.done()); + ownValue = constructStatementNode("constructorCall", arguments.done()); //setKeywordParameters("typeParameters", types); return false; @@ -384,7 +426,7 @@ public boolean visit(EnhancedForStatement node) { @Override public boolean visit(EnumConstantDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); @@ -397,14 +439,14 @@ public boolean visit(EnumConstantDeclaration node) { IValue anonymousClassDeclaration = node.getAnonymousClassDeclaration() == null ? null : visitChild(node.getAnonymousClassDeclaration()); - ownValue = constructDeclarationNode("enumConstant", name, arguments.done(), anonymousClassDeclaration); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode("enumConstant", modifiers, name, arguments.done(), anonymousClassDeclaration); + return false; } @Override public boolean visit(EnumDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue name = values.string(node.getName().getFullyQualifiedName()); IListWriter implementedInterfaces = values.listWriter(); @@ -429,8 +471,8 @@ public boolean visit(EnumDeclaration node) { } } - ownValue = constructDeclarationNode("enum", name, implementedInterfaces.done(), enumConstants.done(), bodyDeclarations.done()); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode("enum", modifiers, name, implementedInterfaces.done(), enumConstants.done(), bodyDeclarations.done()); + return false; } @@ -454,7 +496,7 @@ public boolean visit(FieldAccess node) { @Override public boolean visit(FieldDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue type = visitChild(node.getType()); IListWriter fragments = values.listWriter(); @@ -463,8 +505,8 @@ public boolean visit(FieldDeclaration node) { fragments.append(visitChild(f)); } - ownValue = constructDeclarationNode("field", type, fragments.done()); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode("field", modifiers, type, fragments.done()); + return false; } @@ -540,11 +582,11 @@ public boolean visit(InfixExpression node) { @Override public boolean visit(Initializer node) { - IList extendedModifiers = parseExtendedModifiers(node); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue body = visitChild(node.getBody()); - ownValue = constructDeclarationNode("initializer", body); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode("initializer", modifiers, body); + return false; } @@ -580,7 +622,7 @@ public boolean visit(LineComment node) { @Override public boolean visit(MarkerAnnotation node) { - IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); + IValue typeName = visitChild(node.getTypeName()); ownValue = constructExpressionNode("markerAnnotation", typeName); return false; @@ -604,7 +646,7 @@ public boolean visit(MemberValuePair node) { @Override public boolean visit(MethodDeclaration node) { String constructorName = "method"; - IList extendedModifiers = parseExtendedModifiers(node); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { @@ -663,8 +705,8 @@ public boolean visit(MethodDeclaration node) { body = constructStatementNode("empty"); } - ownValue = constructDeclarationNode(constructorName, returnType, name, parameters.done(), possibleExceptions.done(), body); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode(constructorName, modifiers, returnType, name, parameters.done(), possibleExceptions.done(), body); + // FIXME: this doesn't seem to be in use anymore //setKeywordParameters("typeParameters", genericTypes); return false; @@ -699,11 +741,13 @@ public boolean visit(MethodInvocation node) { @Override public boolean visit(MethodRef node) { + // TODO: why is this not implemented? return false; } @Override public boolean visit(MethodRefParameter node) { + // TODO: why is this not implemented? return false; } @@ -717,7 +761,7 @@ public boolean visit(Modifier node) { @Override public boolean visit(NormalAnnotation node) { - IValue typeName = values.string(node.getTypeName().getFullyQualifiedName()); + IValue typeName = visitChild(node.getTypeName()); IListWriter memberValuePairs = values.listWriter(); for (Iterator it = node.values().iterator(); it.hasNext();) { @@ -748,23 +792,9 @@ public boolean visit(NumberLiteral node) { @Override public boolean visit(PackageDeclaration node) { - IList annotations = parseExtendedModifiers(node.annotations()); - IValue name = visitChild(node.getName()); - ownValue = constructDeclarationNode("package", name); + ownValue = constructDeclarationNode("package", ownAnnotations, name); - // TODO: check if this commented code is indeed replacable by the above - // ownValue = null; - // for (String component: node.getName().getFullyQualifiedName().split("\\.")) { - // if (ownValue == null) { - // ownValue = constructDeclarationNode("package", values.string(component)); - // setKeywordParameter("decl", resolveBinding(component)); - // continue; - // } - // ownValue = constructDeclarationNode("package", ownValue, values.string(component)); - // setKeywordParameter("decl", resolveBinding(component)); - // } - setKeywordParameters("modifiers", annotations); return false; } @@ -869,7 +899,7 @@ public boolean visit(SimpleType node) { @Override public boolean visit(SingleMemberAnnotation node) { - IValue name = values.string(node.getTypeName().getFullyQualifiedName()); + IValue name = visitChild(node.getTypeName()); IValue value = visitChild(node.getValue()); ownValue = constructExpressionNode("singleMemberAnnotation", name, value); @@ -881,16 +911,17 @@ public boolean visit(SingleMemberAnnotation node) { public boolean visit(SingleVariableDeclaration node) { IValue name = visitChild(node.getName()); - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue type = visitChild(node.getType()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); - - ownValue = constructDeclarationNode("parameter", type, name, values.integer(node.getExtraDimensions()), initializer); - if (node.getAST().apiLevel() >= AST.JLS3 && node.isVarargs()) - ownValue = constructDeclarationNode("vararg", type, name); - - setKeywordParameters("modifiers", extendedModifiers); + + if (node.getAST().apiLevel() >= AST.JLS3 && node.isVarargs()) { + ownValue = constructDeclarationNode("vararg", modifiers, type, name); + } + else { + ownValue = constructDeclarationNode("parameter", modifiers, type, name, values.integer(node.getExtraDimensions()), initializer); + } return false; } @@ -969,7 +1000,7 @@ public boolean visit(SuperConstructorInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructStatementNode("constructorCall", values.bool(true), expression, arguments.done()); + ownValue = constructStatementNode("superConstructorCall", expression, arguments.done()); //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -1234,7 +1265,8 @@ public boolean visit(TryStatement node) { @Override public boolean visit(TypeDeclaration node) { - IList extendedModifiers = parseExtendedModifiers(node); + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + String objectType = node.isInterface() ? "interface" : "class"; IValue name = visitChild(node.getName()); @@ -1279,8 +1311,8 @@ public boolean visit(TypeDeclaration node) { bodyDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode(objectType, name, extendsClass.done(), implementsInterfaces.done(), bodyDeclarations.done()); - setKeywordParameters("modifiers", extendedModifiers); + ownValue = constructDeclarationNode(objectType, modifiers, name, extendsClass.done(), implementsInterfaces.done(), bodyDeclarations.done()); + //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -1355,8 +1387,7 @@ public boolean visit(IntersectionType node) { @Override public boolean visit(VariableDeclarationExpression node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); - + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue type = visitChild(node.getType()); @@ -1366,9 +1397,8 @@ public boolean visit(VariableDeclarationExpression node) { fragments.append(visitChild(f)); } - ownValue = constructDeclarationNode("variables", type, fragments.done()); - setKeywordParameters("modifiers", extendedModifiers); - + // intented nesting; we're reusing the Declaration AST node here. + ownValue = constructDeclarationNode("variables", modifiers, type, fragments.done()); ownValue = constructExpressionNode("declarationExpression", ownValue); @@ -1389,8 +1419,7 @@ public boolean visit(VariableDeclarationFragment node) { @Override public boolean visit(VariableDeclarationStatement node) { - IList extendedModifiers = parseExtendedModifiers(node.modifiers()); - + IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue type = visitChild(node.getType()); @@ -1400,9 +1429,8 @@ public boolean visit(VariableDeclarationStatement node) { fragments.append(visitChild(f)); } - ownValue = constructDeclarationNode("variables", type, fragments.done()); - setKeywordParameters("modifiers", extendedModifiers); - + // intented nesting; we reuse the declaration node inside a statement node + ownValue = constructDeclarationNode("variables", modifiers, type, fragments.done()); ownValue = constructStatementNode("declarationStatement", ownValue); return false; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index f569a6b32f6..1503cf397b6 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -36,6 +36,9 @@ public abstract class JavaToRascalConverter extends ASTVisitor { protected final LimitedTypeStore typeStore; protected IValue ownValue; + protected IList ownAnnotations; + protected IList ownModifiers; + private static final String DATATYPE_RASCAL_AST_TYPE_NODE = "Type"; private static final String DATATYPE_RASCAL_AST_MODIFIER_NODE = "Modifier"; private static final String DATATYPE_RASCAL_AST_DECLARATION_NODE = "Declaration"; @@ -78,6 +81,34 @@ public abstract class JavaToRascalConverter extends ASTVisitor { messages = values.listWriter(); } + /** + * The JDT's AST format stores list of modifiers separately from lists of annotations, even though + * syntactically they may occur in arbitrary order before most declaration kinds in Java. To recreate + * a properly ordered AST, this helper functions merges the lists again in order of appearance + */ + protected IList mergeModifiersAndAnnotationsInOrderOfAppearance(IList modifiers, IList annotations) { + if (modifiers == null && annotations == null) { + return values.list(); + } + else if (modifiers == null) { + return annotations; + } + else if (annotations == null) { + return modifiers; + } + + var everything = modifiers.concat(annotations); + + return everything.stream() + .map(v -> (IConstructor) v) + .sorted((IConstructor a, IConstructor b) -> Integer.compare(location(a).getOffset(), location(b).getOffset())) + .collect(values.listWriter()); + } + + private ISourceLocation location(IValue ast) { + return (ISourceLocation) ((IConstructor) ast).asWithKeywordParameters().getParameter("src"); + } + protected ISourceLocation resolveBinding(String packageComponent) { ISourceLocation packageBinding = new BindingsResolver(typeStore, locationCache, this.collectBindings) { public ISourceLocation resolveBinding(String packageC) { @@ -98,7 +129,7 @@ public ISourceLocation resolveBinding(String packageC) { return packageBinding; } - protected ISourceLocation resolveBinding(CompilationUnit node) { + protected final ISourceLocation resolveBinding(CompilationUnit node) { ISourceLocation compilationUnit = new BindingsResolver(typeStore, locationCache, true) { public ISourceLocation resolveBinding(CompilationUnit node) { return makeBinding("java+compilationUnit", null, loc.getPath()); From 0babe3efadb2d3ca53cda5646a1181d4cb25ee59 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 17:00:42 +0200 Subject: [PATCH 029/134] minor cleanup --- .../lang/java/m3/internal/ASMNodeResolver.java | 16 ---------------- .../java/m3/internal/EclipseJavaCompiler.java | 2 +- .../lang/java/m3/internal/M3Converter.java | 9 ++++++++- .../lang/java/m3/internal/M3LocationUtil.java | 14 ++------------ 4 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java index d823e3a994c..84d65ee8469 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java @@ -60,19 +60,7 @@ public class ASMNodeResolver implements NodeResolver { - - //--------------------------------------------- - // Fields - //--------------------------------------------- - - /** - * Supports the creation of Rascal values. - */ private static final IValueFactory valueFactory = ValueFactoryFactory.getValueFactory(); - - /** - * Supports the creation of Rascal types. - */ private static final TypeFactory typeFactory = TypeFactory.getInstance(); /** @@ -107,10 +95,6 @@ public class ASMNodeResolver implements NodeResolver { private final SourceLocationClassLoader loader; - //--------------------------------------------- - // Methods - //--------------------------------------------- - /** * ASMNodeResolver constructor * @param typeStore diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index 935b53c8e89..a8c0fa8c8a2 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -308,7 +308,7 @@ protected ASTParser constructASTParser(boolean resolveBindings, boolean errorRec Hashtable options = new Hashtable(); options.put(JavaCore.COMPILER_SOURCE, ((IString) javaVersion.asWithKeywordParameters().getParameter("version")).getValue()); - options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.asWithKeywordParameters().getParameter("version")).getValue()); + options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.get("version")).getValue()); options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, previewParameter.getValue() ? JavaCore.ENABLED : JavaCore.DISABLED); options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index 1dd27ba1064..3dc4c7f62e3 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -8,11 +8,13 @@ import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; +import io.usethesource.vallang.type.Type; import io.usethesource.vallang.type.TypeFactory; public abstract class M3Converter extends JavaToRascalConverter { - private static final String DATATYPE_M3_NODE = "M3"; + private static final String DATATYPE_M3_NODE = "M3"; private final io.usethesource.vallang.type.Type DATATYPE_M3_NODE_TYPE; + private final io.usethesource.vallang.type.Type DATATYPE_M3_LANGUAGE_TYPE; protected final Stack scopeManager = new Stack(); @@ -31,12 +33,16 @@ public abstract class M3Converter extends JavaToRascalConverter { protected ISetWriter types; protected ISetWriter annotations; protected final io.usethesource.vallang.type.Type CONSTRUCTOR_M3; + protected final Type JAVA_LANGUAGE_M3; + protected ISetWriter languages; M3Converter(final LimitedTypeStore typeStore, java.util.Map cache) { super(typeStore, cache, true); this.DATATYPE_M3_NODE_TYPE = this.typeStore.lookupAbstractDataType(DATATYPE_M3_NODE); + this.DATATYPE_M3_LANGUAGE_TYPE = this.typeStore.lookupAbstractDataType("Language"); TypeFactory tf = TypeFactory.getInstance(); this.CONSTRUCTOR_M3= this.typeStore.lookupConstructor(DATATYPE_M3_NODE_TYPE, "m3", tf.tupleType(tf.sourceLocationType())); + this.JAVA_LANGUAGE_M3 = this.typeStore.lookupConstructor(DATATYPE_M3_LANGUAGE_TYPE, "java", tf.tupleEmpty()); uses = values.setWriter(); declarations = values.setWriter(); containment = values.setWriter(); @@ -51,6 +57,7 @@ public abstract class M3Converter extends JavaToRascalConverter { methodOverrides = values.setWriter(); annotations = values.setWriter(); types = values.setWriter(); + languages = values.setWriter(); } public IValue getModel(boolean insertErrors) { diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java index 1f5f9ce90c8..9508eb25d9d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java @@ -22,19 +22,9 @@ import io.usethesource.vallang.IValueFactory; public class M3LocationUtil { - - //--------------------------------------------- - // Fields - //--------------------------------------------- - - private static final IValueFactory valueFactory = ValueFactoryFactory.getValueFactory(); - + private static final IValueFactory valueFactory = ValueFactoryFactory.getValueFactory(); - //--------------------------------------------- - // Methods - //--------------------------------------------- - - /** + /** * Creates a location. Existing exceptions are captured as a * RuntimeException. * @param scheme - location scheme From f00d64a2dbdfb51ea9d92a06071900008e5fda86 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 18 Apr 2024 17:56:44 +0200 Subject: [PATCH 030/134] jar converter now records java version for each class file --- .../rascalmpl/library/lang/java/m3/Core.rsc | 16 +---- .../java/m3/internal/ASMNodeResolver.java | 71 +++++++++++++++++++ .../lang/java/m3/internal/JarConverter.java | 11 +++ .../lang/java/m3/internal/M3Converter.java | 7 ++ .../lang/java/m3/internal/NodeResolver.java | 2 + 5 files changed, 92 insertions(+), 15 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index fe871c1b9ad..4989481546a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -36,21 +36,7 @@ data Language(str version="") = java(); @synopsis{Combines a set of Java meta models by merging their relations.} @memo -M3 composeJavaM3(loc id, set[M3] models) { - // Compose the generic M3 relations first - M3 comp = composeM3(id, models); - - // Then the Java-specific ones - comp.extends = {*model.extends | model <- models}; - comp.implements = {*model.implements | model <- models}; - comp.methodInvocation = {*model.methodInvocation | model <- models}; - comp.fieldAccess = {*model.fieldAccess | model <- models}; - comp.typeDependency = {*model.typeDependency | model <- models}; - comp.methodOverrides = {*model.methodOverrides | model <- models}; - comp.annotations = {*model.annotations | model <- models}; - - return comp; -} +M3 composeJavaM3(loc id, set[M3] models) = composeM3(id, models); @synopsis{Returns the difference between the first model and the others.} @description{ diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java index 84d65ee8469..00cc0a019bc 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java @@ -51,6 +51,7 @@ import org.rascalmpl.values.ValueFactoryFactory; import io.usethesource.vallang.IConstructor; +import io.usethesource.vallang.IInteger; import io.usethesource.vallang.IList; import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.ISourceLocation; @@ -493,6 +494,76 @@ public String resolveClassScheme(ClassNode node) { typeSchemes.computeIfAbsent(node.name, k -> resolveClassScheme(node.access)); return resolveClassScheme(node.access); } + + @Override + public IConstructor resolveLanguageVersion(ClassNode node) { + var classToVersions = Map.of( + 3 << 16 | 45, "1.1", + 0 << 16 | 46, "1.2", + 0 << 16 | 47, "1.3", + 0 << 16 | 48, "1.4", + 0 << 16 | 49, "1.5", + 0 << 16 | 50, "1.6", + 0 << 16 | 51, "1.7", + 0 << 16 | 52, "1.8"); + + classToVersions.putAll(Map.of( + 0 << 16 | 53, "9", + 0 << 16 | 54, "10", + 0 << 16 | 55, "11", + 0 << 16 | 56, "12", + 0 << 16 | 57, "13", + 0 << 16 | 58, "14", + 0 << 16 | 59, "15", + 0 << 16 | 60, "16", + 0 << 16 | 61, "17", + 0 << 16 | 62, "18")); + + classToVersions.putAll(Map.of( + 0 << 16 | 63, "19", + 0 << 16 | 64, "20", + 0 << 16 | 65, "21", + 0 << 16 | 66, "22")); + + var classToLevels = Map.of( + 3 << 16 | 45, 1, + 0 << 16 | 46, 2, + 0 << 16 | 47, 3, + 0 << 16 | 48, 4, + 0 << 16 | 49, 5, + 0 << 16 | 50, 6, + 0 << 16 | 51, 7, + 0 << 16 | 52, 8); + + classToLevels.putAll(Map.of( + 0 << 16 | 53, 9, + 0 << 16 | 54, 10, + 0 << 16 | 55, 11, + 0 << 16 | 56, 12, + 0 << 16 | 57, 13, + 0 << 16 | 58, 14, + 0 << 16 | 59, 15, + 0 << 16 | 60, 16, + 0 << 16 | 61, 17, + 0 << 16 | 62, 18)); + + classToLevels.putAll(Map.of( + 0 << 16 | 63, 19, + 0 << 16 | 64, 20, + 0 << 16 | 65, 21, + 0 << 16 | 66, 22)); + + IInteger classFileLevel = valueFactory.integer(classToLevels.get(node.version)); + IString classFileVersion = valueFactory.string(classToVersions.get(node.version)); + + var Lang = typeStore.lookupAbstractDataType("Language"); + var javaCons = typeStore.lookupConstructor(Lang, "java", typeFactory.tupleEmpty()); + var langCons = valueFactory.constructor(javaCons); + langCons = langCons.asWithKeywordParameters().setParameter("version", classFileVersion); + langCons = langCons.asWithKeywordParameters().setParameter("level", classFileLevel); + + return langCons; + } @Override public IConstructor resolveType(Object node, ISourceLocation parent) { diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index d0e59ad8a55..997456353c5 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -183,6 +183,8 @@ private void createSingleClassM3(String className, IList classpath) { setCompilationUnitRelations(compUnit); setPackagesRelations(compUnit); setClassRelations(classReader, compUnit); + + } /** @@ -284,6 +286,7 @@ private void setClassRelations(ClassReader classReader, String compUnitRelative) setInnerClassRelations(classNode, classLogical); setFieldRelations(classNode, classLogical); setMethodRelations(classNode, classLogical); + setLanguages(resolver.resolveLanguageVersion(classNode)); } } @@ -350,6 +353,10 @@ private void setFieldRelations(ClassNode classNode, ISourceLocation classLogical } } + private void setLanguages(IConstructor version) { + addToLanguages(version); + } + /** * Sets M3 relations of all methods of a given class node. The * creation of relations associated to parameters and bytecode @@ -700,6 +707,10 @@ private void addToTypes(ISourceLocation logical, IConstructor cons) { insert(types, logical, cons); } + private void addToLanguages(IConstructor lang) { + insert(languages, lang); + } + /** * Composes two lists of annotation nodes. * @param ann1 - first annotation list diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index 3dc4c7f62e3..e92839b2734 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -62,6 +62,8 @@ public abstract class M3Converter extends JavaToRascalConverter { public IValue getModel(boolean insertErrors) { ownValue = values.constructor(CONSTRUCTOR_M3, loc); + + setKeywordParameter("languages", languages.done()); setKeywordParameter("declarations", declarations.done()); setKeywordParameter("uses", uses.done()); setKeywordParameter("containment", containment.done()); @@ -77,6 +79,7 @@ public IValue getModel(boolean insertErrors) { setKeywordParameter("types", types.done()); setKeywordParameter("annotations", annotations.done()); insertCompilationUnitMessages(insertErrors, messages.done()); + return ownValue; } @@ -109,6 +112,10 @@ public void insert(ISetWriter relW, IValue lhs, IConstructor rhs) { relW.insert(values.tuple(lhs, rhs)); } } + + public void insert(ISetWriter setW, IValue elem) { + setW.insert(elem); + } protected boolean isValid(ISourceLocation binding) { return binding != null && !(binding.getScheme().equals("unknown") || binding.getScheme().equals("unresolved")); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/NodeResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/NodeResolver.java index 479942a364b..5aac0d5ea03 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/NodeResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/NodeResolver.java @@ -24,6 +24,8 @@ public interface NodeResolver { + IConstructor resolveLanguageVersion(ClassNode node); + /** * Returns the location of a bytecode node given a bytecode * object and its parent logical location. From 3199f38d59f40224df78bc7580216073430cab57 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 19 Apr 2024 19:12:47 +0200 Subject: [PATCH 031/134] fixed missing physical location for extracting single class files --- src/org/rascalmpl/library/lang/java/m3/Core.rsc | 10 +++++----- .../library/lang/java/m3/internal/JarConverter.java | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 4989481546a..d4ea48cc796 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -69,7 +69,7 @@ M3 diffJavaM3(loc id, list[M3] models) { @description{ Identical to ((createM3sFromFiles)): `createM3sFromFiles({file})`. } -M3 createM3FromFile(loc file, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7") { +M3 createM3FromFile(loc file, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()) { result = createM3sFromFiles({file}, errorRecovery = errorRecovery, sourcePath = sourcePath, classPath = classPath, javaVersion = javaVersion); if ({oneResult} := result) { return oneResult; @@ -82,20 +82,20 @@ M3 createM3FromFile(loc file, bool errorRecovery = false, list[loc] sourcePath = Each M3 has the `id` filled with a matching location from `files`. } @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -java set[M3] createM3sFromFiles(set[loc] files, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7"); +java set[M3] createM3sFromFiles(set[loc] files, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()); @synopsis{For a set of Java files, creates a composed M3.} @description{ While ((createM3sFromFiles)) leaves the M3s separated, this function composes them into a single model. } -M3 createM3FromFiles(loc projectName, set[loc] files, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7") +M3 createM3FromFiles(loc projectName, set[loc] files, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()) = composeJavaM3(projectName, createM3sFromFiles(files, errorRecovery = errorRecovery, sourcePath = sourcePath, classPath = classPath, javaVersion = javaVersion)); @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -java tuple[set[M3], set[Declaration]] createM3sAndAstsFromFiles(set[loc] files, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7"); +java tuple[set[M3], set[Declaration]] createM3sAndAstsFromFiles(set[loc] files, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()); @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} -java M3 createM3FromString(loc fileName, str contents, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], str javaVersion = "1.7"); +java M3 createM3FromString(loc fileName, str contents, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()); @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} java M3 createM3FromJarClass(loc jarClass, list[loc] classPath = []); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index 997456353c5..f369e939d28 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -42,7 +42,9 @@ import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import org.objectweb.asm.tree.TypeInsnNode; +import org.rascalmpl.interpreter.utils.RascalManifest; import org.rascalmpl.uri.URIResolverRegistry; +import org.rascalmpl.uri.URIUtil; import io.usethesource.vallang.IConstructor; import io.usethesource.vallang.IList; @@ -177,9 +179,10 @@ private void createSingleClassM3(String className, IList classpath) { resolver = new ASMNodeResolver(loc, classpath, typeStore); } - String compUnit = className; + String compUnit = className.replaceAll("\\.", "/"); ClassReader classReader = resolver.buildClassReader(className); + this.compUnitPhysical = URIUtil.getChildLocation(RascalManifest.jarify(loc), compUnit + ".class"); setCompilationUnitRelations(compUnit); setPackagesRelations(compUnit); setClassRelations(classReader, compUnit); @@ -269,6 +272,7 @@ private void setClassRelations(ClassReader classReader, String compUnitRelative) IString className = M3LocationUtil.getLocationName(classNode.name); ISourceLocation compUnitLogical = M3LocationUtil.makeLocation(COMP_UNIT_SCHEME, "", compUnitRelative); + ISourceLocation classLogical = resolver.resolveBinding(classNode, null); ISourceLocation classPhysical = M3LocationUtil.makeLocation(compUnitPhysical, classReader.header, classReader.b.length); IConstructor cons = resolver.resolveType(classNode, null); From 5fcdd6748928d75130dd8b0131c0d4cdbaf100f0 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 19 Apr 2024 19:14:39 +0200 Subject: [PATCH 032/134] fixed physical location of .class files in jars --- .../rascalmpl/library/lang/java/m3/internal/JarConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index f369e939d28..dd8c56b783e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -149,7 +149,7 @@ private void createM3() { try (JarInputStream jarStream = new JarInputStream(registry.getInputStream(loc))) { JarEntry entry = jarStream.getNextJarEntry(); while (entry != null) { - compUnitPhysical = M3LocationUtil.extendPath(loc, entry.getName()); + compUnitPhysical = URIUtil.getChildLocation(RascalManifest.jarify(loc), entry.getName() + ".class"); if (entry.getName().endsWith(".class")) { String compUnit = getCompilationUnitRelativePath(); From 1ba7a8372c3da59104da7a49a9c5d3672e595de4 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 19 Apr 2024 20:21:45 +0200 Subject: [PATCH 033/134] fixed silly bugs in implementation of language levels for class file analysis --- .../rascalmpl/library/lang/java/m3/Core.rsc | 4 +- .../java/m3/internal/ASMNodeResolver.java | 101 ++++++++---------- 2 files changed, 49 insertions(+), 56 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index d4ea48cc796..099f55e014c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -107,7 +107,7 @@ java M3 createM3FromSingleClass(loc jarClass, str className, list[loc] classPath java M3 createM3FromJarFile(loc jarLoc, list[loc] classPath = []); @synopsis{Globs for jars, class files and java files in a directory and tries to compile all source files into an M3 model} -M3 createM3FromDirectory(loc project, bool errorRecovery = false, bool includeJarModels=false, str javaVersion = "1.7", list[loc] classPath = []) { +M3 createM3FromDirectory(loc project, bool errorRecovery = false, bool includeJarModels=false, Language javaVersion = JLS13(), list[loc] classPath = []) { if (!(isDirectory(project))) { throw " is not a valid directory"; } @@ -134,7 +134,7 @@ M3 createM3FromDirectory(loc project, bool errorRecovery = false, bool includeJa } @synopsis{Globs for jars, class files and java files in a directory and tries to compile all source files into an M3 model} -M3 createM3FromMavenProject(loc project, bool errorRecovery = false, bool includeJarModels=false, str javaVersion = "1.7") { +M3 createM3FromMavenProject(loc project, bool errorRecovery = false, bool includeJarModels=false, Language javaVersion = JLS13()) { if (!exists(project + "pom.xml")) { throw IO("pom.xml not found"); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java index 00cc0a019bc..9f0c4e1cf94 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java @@ -497,62 +497,55 @@ public String resolveClassScheme(ClassNode node) { @Override public IConstructor resolveLanguageVersion(ClassNode node) { - var classToVersions = Map.of( - 3 << 16 | 45, "1.1", - 0 << 16 | 46, "1.2", - 0 << 16 | 47, "1.3", - 0 << 16 | 48, "1.4", - 0 << 16 | 49, "1.5", - 0 << 16 | 50, "1.6", - 0 << 16 | 51, "1.7", - 0 << 16 | 52, "1.8"); + var classToVersions = Map.ofEntries( + Map.entry(Opcodes.V1_1, "1.1"), + Map.entry(Opcodes.V1_2, "1.2"), + Map.entry(Opcodes.V1_3, "1.3"), + Map.entry(Opcodes.V1_4, "1.4"), + Map.entry(Opcodes.V1_5, "1.5"), + Map.entry(Opcodes.V1_6, "1.6"), + Map.entry(Opcodes.V1_7, "1.7"), + Map.entry(Opcodes.V1_8, "1.8"), + Map.entry(Opcodes.V9, "9"), + Map.entry(Opcodes.V10, "10"), + Map.entry(Opcodes.V11, "11"), + Map.entry(Opcodes.V12, "12"), + Map.entry(Opcodes.V13, "13"), + Map.entry(Opcodes.V14, "14"), + Map.entry(Opcodes.V15, "15"), + Map.entry(Opcodes.V16, "16"), + Map.entry(Opcodes.V17, "17"), + Map.entry(Opcodes.V18, "18"), + Map.entry(Opcodes.V19, "19"), + Map.entry(Opcodes.V20, "20"), + Map.entry(Opcodes.V21, "21"), + Map.entry(Opcodes.V22, "22")); - classToVersions.putAll(Map.of( - 0 << 16 | 53, "9", - 0 << 16 | 54, "10", - 0 << 16 | 55, "11", - 0 << 16 | 56, "12", - 0 << 16 | 57, "13", - 0 << 16 | 58, "14", - 0 << 16 | 59, "15", - 0 << 16 | 60, "16", - 0 << 16 | 61, "17", - 0 << 16 | 62, "18")); + var classToLevels = Map.ofEntries( + Map.entry(Opcodes.V1_1, 1), + Map.entry(Opcodes.V1_2, 2), + Map.entry(Opcodes.V1_3, 3), + Map.entry(Opcodes.V1_4, 4), + Map.entry(Opcodes.V1_5, 5), + Map.entry(Opcodes.V1_6, 6), + Map.entry(Opcodes.V1_7, 7), + Map.entry(Opcodes.V1_8, 8), + Map.entry(Opcodes.V9, 9), + Map.entry(Opcodes.V10, 10), + Map.entry(Opcodes.V11, 11), + Map.entry(Opcodes.V12, 12), + Map.entry(Opcodes.V13, 13), + Map.entry(Opcodes.V14, 14), + Map.entry(Opcodes.V15, 15), + Map.entry(Opcodes.V16, 16), + Map.entry(Opcodes.V17, 17), + Map.entry(Opcodes.V18, 18), + Map.entry(Opcodes.V19, 19), + Map.entry(Opcodes.V20, 20), + Map.entry(Opcodes.V21, 21), + Map.entry(Opcodes.V22, 22)); - classToVersions.putAll(Map.of( - 0 << 16 | 63, "19", - 0 << 16 | 64, "20", - 0 << 16 | 65, "21", - 0 << 16 | 66, "22")); - - var classToLevels = Map.of( - 3 << 16 | 45, 1, - 0 << 16 | 46, 2, - 0 << 16 | 47, 3, - 0 << 16 | 48, 4, - 0 << 16 | 49, 5, - 0 << 16 | 50, 6, - 0 << 16 | 51, 7, - 0 << 16 | 52, 8); - - classToLevels.putAll(Map.of( - 0 << 16 | 53, 9, - 0 << 16 | 54, 10, - 0 << 16 | 55, 11, - 0 << 16 | 56, 12, - 0 << 16 | 57, 13, - 0 << 16 | 58, 14, - 0 << 16 | 59, 15, - 0 << 16 | 60, 16, - 0 << 16 | 61, 17, - 0 << 16 | 62, 18)); - - classToLevels.putAll(Map.of( - 0 << 16 | 63, 19, - 0 << 16 | 64, 20, - 0 << 16 | 65, 21, - 0 << 16 | 66, 22)); - + IInteger classFileLevel = valueFactory.integer(classToLevels.get(node.version)); IString classFileVersion = valueFactory.string(classToVersions.get(node.version)); From a91190607680b3f70b6feff569ef0dc8e1e060db Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 12:14:57 +0200 Subject: [PATCH 034/134] M3 from source code extractors now also store the configured language in the languages set --- .../java/m3/internal/EclipseJavaCompiler.java | 16 ++++++++-------- .../java/m3/internal/JavaToRascalConverter.java | 2 +- .../lang/java/m3/internal/M3Converter.java | 5 +++++ 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index a8c0fa8c8a2..a823bd1e5ac 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -101,7 +101,7 @@ protected IValue createM3sFromFiles(ISet files, IBool errorRecovery, IList sourc ISetWriter result = VF.setWriter(); buildCompilationUnits(files, true, errorRecovery.getValue(), sourcePath, classPath, javaVersion, (loc, cu) -> { interruptChecker.run(); - result.insert(convertToM3(store, cache, loc, cu)); + result.insert(convertToM3(store, cache, loc, javaVersion, cu)); }); return result.done(); } catch (IOException e) { @@ -125,8 +125,8 @@ protected IValue createM3sAndAstsFromFiles(ISet files, IBool errorRecovery, ILis ISetWriter asts = VF.setWriter(); buildCompilationUnits(files, true, errorRecovery.getValue(), sourcePath, classPath, javaVersion, (loc, cu) -> { interruptChecker.run(); - m3s.insert(convertToM3(store, cache, loc, cu)); - asts.insert(convertToAST(VF.bool(true), cache, loc, cu, store)); + m3s.insert(convertToM3(store, cache, loc, javaVersion, cu)); + asts.insert(convertToAST(VF.bool(true), cache, loc, javaVersion, cu, store)); }); return VF.tuple(m3s.done(), asts.done()); } catch (IOException e) { @@ -143,7 +143,7 @@ public IValue createM3FromString(ISourceLocation loc, IString contents, IBool er protected IValue createM3FromString(ISourceLocation loc, IString contents, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store) { try { CompilationUnit cu = getCompilationUnit(loc.getPath(), contents.getValue().toCharArray(), true, errorRecovery.getValue(), javaVersion, translatePaths(sourcePath), translatePaths(classPath)); - return convertToM3(store, new HashMap<>(), loc, cu); + return convertToM3(store, new HashMap<>(), loc, javaVersion, cu); } catch (IOException e) { throw RuntimeExceptionFactory.io(VF.string(e.getMessage()), null, null); } @@ -160,7 +160,7 @@ protected IValue createAstsFromFiles(ISet files, IBool collectBindings, IBool er buildCompilationUnits(files, collectBindings.getValue(), errorRecovery.getValue(), sourcePath, classPath, javaVersion, (loc, cu) -> { interruptChecker.run(); - result.insert(convertToAST(collectBindings, cache, loc, cu, store)); + result.insert(convertToAST(collectBindings, cache, loc, javaVersion, cu, store)); }); return result.done(); } catch (IOException e) { @@ -175,13 +175,13 @@ public IValue createAstFromString(ISourceLocation loc, IString contents, IBool c protected IValue createAstFromString(ISourceLocation loc, IString contents, IBool collectBindings, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store) { try { CompilationUnit cu = getCompilationUnit(loc.getPath(), contents.getValue().toCharArray(), collectBindings.getValue(), errorRecovery.getValue(), javaVersion, translatePaths(sourcePath), translatePaths(classPath)); - return convertToAST(collectBindings, new HashMap<>(), loc, cu, store); + return convertToAST(collectBindings, new HashMap<>(), loc, javaVersion, cu, store); } catch (IOException e) { throw RuntimeExceptionFactory.io(VF.string(e.getMessage()), null, null); } } - protected IValue convertToM3(LimitedTypeStore store, Map cache, ISourceLocation loc, CompilationUnit cu) { + protected IValue convertToM3(LimitedTypeStore store, Map cache, ISourceLocation loc, IConstructor javaVersion, CompilationUnit cu) { SourceConverter converter = new SourceConverter(store, cache); converter.convert(cu, cu, loc); for (Object cm: cu.getCommentList()) { @@ -286,7 +286,7 @@ protected CompilationUnit getCompilationUnit(String unitName, char[] contents, b return (CompilationUnit) parser.createAST(null); } - protected IValue convertToAST(IBool collectBindings, Map cache, ISourceLocation loc, + protected IValue convertToAST(IBool collectBindings, Map cache, ISourceLocation loc, IConstructor javaVersion, CompilationUnit cu, LimitedTypeStore store) { ASTConverter converter = new ASTConverter(store, cache, collectBindings.getValue()); converter.convert(cu, cu, loc); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 1503cf397b6..88931a560f6 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -63,7 +63,7 @@ public abstract class JavaToRascalConverter extends ASTVisitor { protected IListWriter messages; protected final Map locationCache; - + JavaToRascalConverter(final LimitedTypeStore typeStore, Map cache, boolean collectBindings) { super(true); this.typeStore = typeStore; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index e92839b2734..a8df693bf53 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -36,6 +36,11 @@ public abstract class M3Converter extends JavaToRascalConverter { protected final Type JAVA_LANGUAGE_M3; protected ISetWriter languages; + M3Converter(final LimitedTypeStore typeStore, java.util.Map cache, IConstructor javaVersion) { + this(typeStore, cache); + languages.insert(javaVersion); + } + M3Converter(final LimitedTypeStore typeStore, java.util.Map cache) { super(typeStore, cache, true); this.DATATYPE_M3_NODE_TYPE = this.typeStore.lookupAbstractDataType(DATATYPE_M3_NODE); From 13f2f16fdc467a46e768aacb03f53568e8b74930 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 12:25:02 +0200 Subject: [PATCH 035/134] added type parameters to classes and interfaces --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 4 ++-- .../library/lang/java/m3/internal/ASTConverter.java | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 0bf40b06f58..15cace13594 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -39,9 +39,9 @@ data Declaration | \enum(list[Modifier] modifiers, Expression name, list[Type] implements, list[Declaration] constants, list[Declaration] body) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments, Declaration class) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments) - | \class(list[Modifier] modifiers, Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) + | \class(list[Modifier] modifiers, Expression name, list[Type] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \class(list[Modifier] modifiers, list[Declaration] body) - | \interface(list[Modifier] modifiers, Expression name, list[Type] extends, list[Type] implements, list[Declaration] body) + | \interface(list[Modifier] modifiers, Expression name, list[Type] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \field(list[Modifier] modifiers, Type \type, list[Expression] fragments) | \initializer(list[Modifier] modifiers, Statement initializerBody) | \method(list[Modifier] modifiers, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index a75c3526ce5..f088b0b4824 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1270,6 +1270,12 @@ public boolean visit(TypeDeclaration node) { String objectType = node.isInterface() ? "interface" : "class"; IValue name = visitChild(node.getName()); + IList typeParams = ((List) node.typeParameters()) + .stream() + .map(o -> (ASTNode) o) + .map(t -> visitChild(t)) + .collect(values.listWriter()); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeParameters().isEmpty()) { From f4a804d35bdf9a16ec307f0fd399c641a4449bc5 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 12:25:16 +0200 Subject: [PATCH 036/134] comments --- .../library/lang/java/m3/internal/JarConverter.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index dd8c56b783e..8b077750d94 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -56,12 +56,7 @@ //TODO: check offset + length in physical locations. //TODO: change when JarInputStream problem is solved. public class JarConverter extends M3Converter { - - //--------------------------------------------- - // Fields - //--------------------------------------------- - - /** + /** * Physical source location of the current compilation unit. * A .class file is considered as a computational unit. */ @@ -186,8 +181,6 @@ private void createSingleClassM3(String className, IList classpath) { setCompilationUnitRelations(compUnit); setPackagesRelations(compUnit); setClassRelations(classReader, compUnit); - - } /** From 81d8b468c62c2009af4f656d9879ed8a3eb8434d Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 12:27:09 +0200 Subject: [PATCH 037/134] wired typeParamaters back into classes and interfaces --- .../library/lang/java/m3/internal/ASTConverter.java | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index f088b0b4824..1825d2c5588 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1270,12 +1270,6 @@ public boolean visit(TypeDeclaration node) { String objectType = node.isInterface() ? "interface" : "class"; IValue name = visitChild(node.getName()); - IList typeParams = ((List) node.typeParameters()) - .stream() - .map(o -> (ASTNode) o) - .map(t -> visitChild(t)) - .collect(values.listWriter()); - IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeParameters().isEmpty()) { @@ -1317,9 +1311,8 @@ public boolean visit(TypeDeclaration node) { bodyDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode(objectType, modifiers, name, extendsClass.done(), implementsInterfaces.done(), bodyDeclarations.done()); + ownValue = constructDeclarationNode(objectType, modifiers, name, genericTypes.done(), extendsClass.done(), implementsInterfaces.done(), bodyDeclarations.done()); - //setKeywordParameters("typeParameters", genericTypes); return false; } From 31bc8c13f39c58a9640cdf4364b9432efecf53f6 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 12:35:20 +0200 Subject: [PATCH 038/134] added type parameters back into method ASTs --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 6 +++--- .../library/lang/java/m3/internal/ASTConverter.java | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 15cace13594..5b4d2698140 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -44,8 +44,8 @@ data Declaration | \interface(list[Modifier] modifiers, Expression name, list[Type] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \field(list[Modifier] modifiers, Type \type, list[Expression] fragments) | \initializer(list[Modifier] modifiers, Statement initializerBody) - | \method(list[Modifier] modifiers, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) - | \method(list[Modifier] modifiers, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) + | \method(list[Modifier] modifiers, list[Type] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) + | \method(list[Modifier] modifiers, list[Type] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) | \constructor(list[Modifier] modifiers, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) | \import(Expression name) | \package(list[Modifier] modifiers, Expression name) @@ -55,7 +55,7 @@ data Declaration | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name) | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name, Expression defaultBlock) // initializers missing in parameter, is it needed in vararg? - | \parameter(list[Modifier] modifiers, Type \type, Expression name, int extraDimensions) + | \parameter(list[Modifier] modifiers, Type \type, Expression name, int extraDimensions) // TODO: int is not syntax | \vararg(list[Modifier] modifiers, Type \type, Expression name) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 1825d2c5588..cc491b76294 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -705,13 +705,13 @@ public boolean visit(MethodDeclaration node) { body = constructStatementNode("empty"); } - ownValue = constructDeclarationNode(constructorName, modifiers, returnType, name, parameters.done(), possibleExceptions.done(), body); + ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done(), body); - // FIXME: this doesn't seem to be in use anymore - //setKeywordParameters("typeParameters", genericTypes); return false; } - + public static final T getT() { + return null; + } @Override public boolean visit(MethodInvocation node) { IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); From 3c30dd27d8fa43e4aa4d3d38c2fcc8c87fb80c91 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 12:52:34 +0200 Subject: [PATCH 039/134] converted extra dimensions for parameter nodes like int a[][] back to full AST nodes instead of an integer value. This also allows to store optional annotations on each array dimension again --- .../rascalmpl/library/lang/java/m3/AST.rsc | 8 ++--- .../lang/java/m3/internal/ASTConverter.java | 32 ++++++++++++++++--- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 5b4d2698140..1040d3c666b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -54,8 +54,8 @@ data Declaration | \annotationType(list[Modifier] modifiers, Expression name, list[Declaration] body) | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name) | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name, Expression defaultBlock) - // initializers missing in parameter, is it needed in vararg? - | \parameter(list[Modifier] modifiers, Type \type, Expression name, int extraDimensions) // TODO: int is not syntax + | \parameter(list[Modifier] modifiers, Type \type, Expression name, list[Declaration] dimensions) + | \dimension(list[Modifier] annotations) | \vararg(list[Modifier] modifiers, Type \type, Expression name) ; @@ -95,8 +95,8 @@ data Expression(TypeSymbol typ=\unresolved()) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) - | \variable(str identifier, int extraDimensions) // TODO: an int is not syntax - | \variable(str identifier, int extraDimensions, Expression \initializer) // TODO: an int is not syntax + | \variable(str identifier, list[Declaration] dimensions) + | \variable(str identifier, list[Declaration] dimensions, Expression \initializer) | \bracket(Expression expression) | \this() | \this(Expression thisExpression) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index cc491b76294..7b53f8c403a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -910,21 +910,35 @@ public boolean visit(SingleMemberAnnotation node) { @Override public boolean visit(SingleVariableDeclaration node) { IValue name = visitChild(node.getName()); - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); IValue type = visitChild(node.getType()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); - + IList dimensions = ((List) node.extraDimensions()) + .stream() + .map(o -> (ASTNode) o) + .map(d -> visitChild(d)) + .collect(values.listWriter()); + if (node.getAST().apiLevel() >= AST.JLS3 && node.isVarargs()) { ownValue = constructDeclarationNode("vararg", modifiers, type, name); } else { - ownValue = constructDeclarationNode("parameter", modifiers, type, name, values.integer(node.getExtraDimensions()), initializer); + ownValue = constructDeclarationNode("parameter", modifiers, type, name, dimensions, initializer); } return false; } + + @Override + public boolean visit(Dimension node) { + ownValue = constructDeclarationNode("dimension", ownAnnotations); + return false; + } + + int f(int a[][][]) { + return 0; + } @Override public boolean visit(StringLiteral node) { @@ -1409,8 +1423,18 @@ public boolean visit(VariableDeclarationFragment node) { IValue name = values.string(node.getName().getFullyQualifiedName()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); + IList dimensions = ((List) node.extraDimensions()) + .stream() + .map(o -> (ASTNode) o) + .map(d -> visitChild(d)) + .collect(values.listWriter()); - ownValue = constructExpressionNode("variable", name, values.integer(node.getExtraDimensions()), initializer); + if (initializer != null) { + ownValue = constructExpressionNode("variable", name, dimensions, initializer); + } + else { + ownValue = constructExpressionNode("variable", name, dimensions); + } return false; From 0fab8291e35c1162ce9fc2f1489f08416bd59278 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 13:22:25 +0200 Subject: [PATCH 040/134] added documentation --- .../rascalmpl/library/lang/java/m3/AST.rsc | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 1040d3c666b..0c9c95dd605 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -1,4 +1,56 @@ @synopsis{AST node declarations for Java} +@description{ +It helps to start reading in ((analysis::m3::AST)) to find out what we use to model abstract syntax trees +in Rascal, namely algebraic data types with specific properties. + +The "M3" label stands for a standardized set of names of types and their fields that are used similarly +for different programming languages. + +This M3 AST model of Java features: +* For Java the model below contains Declarations, Statements, Expressions, Types and Modifiers. The abstract grammar +below describes an _over approximation_ of the abstract syntax of Java. This means that you could construct +more kinds of syntax trees programmatically than there are stictly exist Java sentences. It also means that every +Java program in existence can be mapped to this simplified tree format, for downstream analysis. +* Java 1 to 13 support +* Name analysis, where every definition of a name and every use of a name are annotated with a fully qualified logical source location, e.g. `decl=|java+interface:///java/util/List` +* Type analysis, where every definition of a type and every expression that produces a type is annotated with `typ=TypeSymbol` +* Annotations, all available in the syntax tree. + +For a more global overview, a database, of what is declarared in Java and what related to what, see the ((lang::java::m3::Core)) model. +There you will also find fact extractors from bytecode and jar files with .class files in them. +} +@benefits{ +* Every AST modelled using M3-style is usually recognizable, even if you are an expert in a different language; +* **HiFi**: This Java AST format is _complete_ and completely informative about Java. For every language construct in existence +there is a node in the tree. Also every node has a `src` attribute to point at the exact location in the source file +where every node originated. +* You can use handy pattern matching primitives like constructor matching, list matching and deep matching for fast analysis. +* `src` and `decl` fields on AST nodes correspond to the M3 Core model's `declarations` and `uses` relations, and others. Combining +AST analysis with lookups in an M3 core model is usually very handy. +* One AST format for all kinds of Java versions. +} +@pitfalls{ +* Confusing the AST type for `Type` syntax with the symbolic representation of types in M3: `TypeSymbol`. +* Writing algorithms that "should" work for any programming language: **don't do it**. Although Rascal M3 ASTs are a _uniform_ format for abstract Syntax +trees, they are _not_ a _unified_ abstract syntax tree formalism. In other words an `\if` statement could have a different semantic in +one language than in another. Frequently this is the case. AST nodes have the same name (between different programming languages) if they have the same +general intention, but their _semantics_ is typically different. +* Abstracting from abstract syntax. (Abstract) Syntax is the bread and butter of (static) code analysis algorithms. If you +introduce functional or object-oriented abstraction layers to hide this intrinsic complexity, the entire algorithm becomes harder to understand +and harder to maintain. + * It's almost always best to _repeat syntactic constructs_ in patterns for pattern matching, and to repeat cases +several times in different contexts, than to introduce ``reusable'' +boolean predicates yourself. + * Such reuse is typically accidentally possible and not intrinsic to the language or the algorithm. Rascal will also help with maintenance if the constructors change over time, by providing warnings and errors. + * If find yourself writing many case distinctions over and over again, it's time to consider using or introducing a new intermediate language like `TypeSymbol`. +* AST instances for older version of Java may contain empty list nodes in locations where a feature was added later (say type parameters of generics). +Analysis algorithms must ignore those values, and probably should know which version they are analysing for. Example: + * Before Java 6 there were no generics and `List` with an empty list of non-existent type parameters just means the list type. + * After Java 6 there were generics and now `List` with an empty list of type-parameters means the "raw type" for List. + * Conclusion: Type compatibility rules are subtly different, while the abstract syntax for both instances is the same. + * Just like between programming languages, between programming language versions: just because two things look the same, + does not mean they mean the same thing. +} module lang::java::m3::AST extend analysis::m3::AST; @@ -32,6 +84,7 @@ Language JLS11() = \java(level=11, version="11"); Language JLS12() = \java(level=12, version="12"); Language JLS13() = \java(level=13, version="13"); +@synopsis{All kind of declarations in Java} data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) | \compilationUnit(Declaration \module) @@ -70,6 +123,7 @@ data Declaration ; +@synopsis{Java Expressions all have a `typ`.} data Expression(TypeSymbol typ=\unresolved()) = \arrayAccess(Expression array, Expression index) | \newArray(Type \type, list[Expression] dimensions, Expression init) @@ -118,6 +172,7 @@ data Expression(TypeSymbol typ=\unresolved()) | \lambda(list[Declaration] parameters, Expression body) ; +@synopsis{These are the Statement types of Java} data Statement = \assert(Expression expression) | \assert(Expression expression, Expression message) From eb1fe84deb1df0b38b5145be9f710c590127838b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 13:26:37 +0200 Subject: [PATCH 041/134] more dimensions cleanup --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 4 ++-- .../library/lang/java/m3/internal/ASTConverter.java | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 0c9c95dd605..76d04bb6bdb 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -149,8 +149,8 @@ data Expression(TypeSymbol typ=\unresolved()) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) - | \variable(str identifier, list[Declaration] dimensions) - | \variable(str identifier, list[Declaration] dimensions, Expression \initializer) + | \variable(str identifier, list[Declaration] dimensionTypes) + | \variable(str identifier, list[Declaration] dimensionTypes, Expression \initializer) | \bracket(Expression expression) | \this() | \this(Expression thisExpression) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 7b53f8c403a..53d15ff1a48 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -181,9 +181,13 @@ public boolean visit(ArrayCreation node) { dimensions.append(visitChild(e)); } - IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); - - ownValue = constructExpressionNode("newArray", type, dimensions.done(), initializer); + if (node.getInitializer() != null) { + IValue initializer = visitChild(node.getInitializer()); + ownValue = constructExpressionNode("newArray", type, dimensions.done(), initializer); + } + else { + ownValue = constructExpressionNode("newArray", type, dimensions.done()); + } return false; } From 97fb84a58505eea98a58325262d309081ff3ad85 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 13:28:35 +0200 Subject: [PATCH 042/134] renamed lowerbound and upperbound ndoes to super and extends to be closer to the actual keywords in the language --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 4 ++-- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 76d04bb6bdb..1d54f2885a9 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -218,8 +218,8 @@ data Type | unionType(list[Type] types) | intersectionType(list[Type] types) | wildcard() - | upperbound(Type \type) - | lowerbound(Type \type) + | super(Type \type) + | extends(Type \type) | \int() | short() | long() diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 53d15ff1a48..7c4f8b309f2 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1482,10 +1482,10 @@ public boolean visit(WildcardType node) { if (node.getBound() != null) { type = visitChild(node.getBound()); if (node.isUpperBound()) { - name = "upperbound"; + name = "extends"; } else { - name = "lowerbound"; + name = "super"; } } ownValue = constructTypeNode(name, type); From b308e953ea85cc87a0cbc0c4ffd8fcb49093dd66 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 13:39:49 +0200 Subject: [PATCH 043/134] added generic type parameters to anonymous inner classes and started to remove passing of null parameters to the AST builder methods --- .../rascalmpl/library/lang/java/m3/AST.rsc | 12 ++-- .../lang/java/m3/internal/ASTConverter.java | 57 ++++++++++++++++--- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 1d54f2885a9..8523eeeee48 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -132,10 +132,10 @@ data Expression(TypeSymbol typ=\unresolved()) | \assignment(Expression lhs, str operator, Expression rhs) | \cast(Type \type, Expression expression) | \characterLiteral(str charValue) - | \newObject(Expression expr, Type \type, list[Expression] args, Declaration class) - | \newObject(Expression expr, Type \type, list[Expression] args) - | \newObject(Type \type, list[Expression] args, Declaration class) - | \newObject(Type \type, list[Expression] args) + | \newObject(Expression expr, Type \type, list[Declaration] typeParameters, list[Expression] args, Declaration class) + | \newObject(Expression expr, Type \type, list[Declaration] typeParameters, list[Expression] args) + | \newObject(Type \type, list[Declaration] typeParameters, list[Expression] args, Declaration class) + | \newObject(Type \type, list[Declaration] typeParameters, list[Expression] args) | \qualifiedName(Expression qualifier, Expression expression) | \conditional(Expression expression, Expression thenBranch, Expression elseBranch) | \fieldAccess(Expression expression, Expression name) @@ -178,9 +178,9 @@ data Statement | \assert(Expression expression, Expression message) | \block(list[Statement] statements) | \break() - | \break(str label) + | \break(Expression label) | \continue() - | \continue(str label) + | \continue(Expression label) | \do(Statement body, Expression condition) | \empty() | \foreach(Declaration parameter, Expression collection, Statement body) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 7c4f8b309f2..f05e48fa347 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -142,8 +142,13 @@ public boolean visit(AnnotationTypeMemberDeclaration node) { IValue name = visitChild(node.getName()); - IValue defaultBlock = node.getDefault() == null ? null : visitChild(node.getDefault()); - ownValue = constructDeclarationNode("annotationTypeMember", modifiers, typeArgument, name, defaultBlock); + if (node.getDefault() != null) { + IValue defaultBlock = visitChild(node.getDefault()); + ownValue = constructDeclarationNode("annotationTypeMember", modifiers, typeArgument, name, defaultBlock); + } + else { + ownValue = constructDeclarationNode("annotationTypeMember", modifiers, typeArgument, name); + } return false; } @@ -217,9 +222,14 @@ public boolean visit(ArrayType node) { @Override public boolean visit(AssertStatement node) { IValue expression = visitChild(node.getExpression()); - IValue message = node.getMessage() == null ? null : visitChild(node.getMessage()); - ownValue = constructStatementNode("assert", expression, message); + if (node.getMessage() != null) { + IValue message = visitChild(node.getMessage()); + ownValue = constructStatementNode("assert", expression, message); + } + else { + ownValue = constructStatementNode("assert", expression); + } return false; } @@ -263,8 +273,17 @@ public boolean visit(BooleanLiteral node) { @Override public boolean visit(BreakStatement node) { - IValue label = node.getLabel() == null ? values.string("") : values.string(node.getLabel().getFullyQualifiedName()); - ownValue = constructStatementNode("break", label); + if (node.getLabel() != null) { + IValue label = visitChild(node.getLabel()); + ownValue = constructStatementNode("break", label); + } + else if (node.getExpression() != null) { + IValue label = visitChild(node.getExpression()); + ownValue = constructStatementNode("break", label); + } + else { + ownValue = constructStatementNode("break"); + } return false; } @@ -326,7 +345,22 @@ public boolean visit(ClassInstanceCreation node) { IValue anonymousClassDeclaration = node.getAnonymousClassDeclaration() == null ? null : visitChild(node.getAnonymousClassDeclaration()); - ownValue = constructExpressionNode("newObject", expression, type, arguments.done(), anonymousClassDeclaration); + if (expression != null) { + if (anonymousClassDeclaration != null) { + ownValue = constructExpressionNode("newObject", expression, type, genericTypes.done(), arguments.done(), anonymousClassDeclaration); + } + else { + ownValue = constructExpressionNode("newObject", expression, type, genericTypes.done(), arguments.done()); + } + } + else { + if (anonymousClassDeclaration != null) { + ownValue = constructExpressionNode("newObject", type, genericTypes.done(), arguments.done(), anonymousClassDeclaration); + } + else { + ownValue = constructExpressionNode("newObject", type, genericTypes.done(), arguments.done()); + } + } //setKeywordParameters("typeParameters", genericTypes); return false; } @@ -394,8 +428,13 @@ public boolean visit(ConstructorInvocation node) { @Override public boolean visit(ContinueStatement node) { - IValue label = node.getLabel() == null ? null : values.string(node.getLabel().getFullyQualifiedName()); - ownValue = constructStatementNode("continue", label); + if (node.getLabel() != null) { + IValue label = visitChild(node.getLabel()); + ownValue = constructStatementNode("continue", label); + } + else { + ownValue = constructStatementNode("continue"); + } return false; } From afcdfcab885864dce1e396e19aa42e1225aa5a0b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 13:44:03 +0200 Subject: [PATCH 044/134] removed a few more nulls passing around and added TODO to know here I was --- .../rascalmpl/library/lang/java/m3/AST.rsc | 2 +- .../lang/java/m3/internal/ASTConverter.java | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 8523eeeee48..deb8672d9f2 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -87,8 +87,8 @@ Language JLS13() = \java(level=13, version="13"); @synopsis{All kind of declarations in Java} data Declaration = \compilationUnit(list[Declaration] imports, list[Declaration] types) - | \compilationUnit(Declaration \module) | \compilationUnit(Declaration package, list[Declaration] imports, list[Declaration] types) + | \compilationUnit(Declaration \module) | \enum(list[Modifier] modifiers, Expression name, list[Type] implements, list[Declaration] constants, list[Declaration] body) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments, Declaration class) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index f05e48fa347..824a7d90b3d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -386,7 +386,13 @@ public boolean visit(CompilationUnit node) { typeDeclarations.append(visitChild(d)); } - ownValue = constructDeclarationNode("compilationUnit", packageOfUnit, imports.done(), typeDeclarations.done()); + if (packageOfUnit != null) { + ownValue = constructDeclarationNode("compilationUnit", packageOfUnit, imports.done(), typeDeclarations.done()); + } + else { + ownValue = constructDeclarationNode("compilationUnit", imports.done(), typeDeclarations.done()); + } + return false; } } @@ -480,9 +486,13 @@ public boolean visit(EnumConstantDeclaration node) { } } - IValue anonymousClassDeclaration = node.getAnonymousClassDeclaration() == null ? null : visitChild(node.getAnonymousClassDeclaration()); - - ownValue = constructDeclarationNode("enumConstant", modifiers, name, arguments.done(), anonymousClassDeclaration); + if (node.getAnonymousClassDeclaration() != null) { + IValue anonymousClassDeclaration = visitChild(node.getAnonymousClassDeclaration()); + ownValue = constructDeclarationNode("enumConstant", modifiers, name, arguments.done(), anonymousClassDeclaration); + } + else { + ownValue = constructDeclarationNode("enumConstant", modifiers, name, arguments.done()); + } return false; } @@ -571,11 +581,17 @@ public boolean visit(ForStatement node) { IValue body = visitChild(node.getBody()); - ownValue = constructStatementNode("for", initializers.done(), booleanExpression, updaters.done(), body); + if (booleanExpression != null) { + ownValue = constructStatementNode("for", initializers.done(), booleanExpression, updaters.done(), body); + } + else { + ownValue = constructStatementNode("for", initializers.done(), updaters.done(), body); + } return false; } + // TODO: Jurgen was here while removing null passing to construct methods @Override public boolean visit(IfStatement node) { IValue booleanExpression = visitChild(node.getExpression()); From b744b5e921737bbaff8600c751c975fc5c159a00 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 13:55:47 +0200 Subject: [PATCH 045/134] documentation --- .../rascalmpl/library/lang/java/m3/AST.rsc | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index deb8672d9f2..494a731de7e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -210,13 +210,14 @@ data Statement | \yield(Expression argument) ; +@synopsis{These are the literal types you can find in Java programs.} data Type = arrayType(Type \type) | parameterizedType(Type \type) | qualifiedType(Type qualifier, Expression simpleName) | simpleType(Expression typeName) | unionType(list[Type] types) - | intersectionType(list[Type] types) + | intersectionType(list[Type] types) // TODO: aren't union types also sometimes present in catch clauses? | wildcard() | super(Type \type) | extends(Type \type) @@ -232,6 +233,10 @@ data Type | \boolean() ; +@synopsis{Modifiers are additional pieces of information attached to (typically) declarations.} +@description{ +This also includes "user-defined" modifers such as so called "Java Annotations". +} data Modifier = \private() | \public() @@ -259,6 +264,23 @@ set[loc] getPaths(loc dir, str suffix) { } @memo +@synopsis{Utility to help configuring the `createAstFromFile` function.} +@description{ +The ((createAstFromFile)) works well if the source roots and library classpath parameters are +configured correctly. + +This helper function crawls the file system from bottom to top. Starting with a potentially +interesting set of Java files or folders for analysis, it finds the "root" of the class path by inspecting +the package declarations all `.java` files and subtracting each package name from their +source location to arrive at a set of root folders. +} +@benefits{ +* Robust way of configuring the source getPaths +} +@pitfalls{ +* Typically projects have dependencies which are not found using this function. +* This function does a lot of IO for just a little fact extraction. +} set[loc] findRoots(set[loc] folders) { set[loc] result = {}; for (folder <- folders) { @@ -309,8 +331,8 @@ public Declaration createAstFromFile(loc file, bool collectBindings, bool errorR @synopsis{Creates ASTs for a set of files using Eclipse JDT compiler.} @pitfalls{ - While the function takes a set of locations, it ignores the positional information of the location. - Meaning, that it analyzes the whole file and not just the part that the positional information describes. +* While the function takes a set of locations, it ignores the positional information of the location. +Meaning, that it analyzes the whole file and not just the part that the positional information describes. } @javaClass{org.rascalmpl.library.lang.java.m3.internal.EclipseJavaCompiler} public java set[Declaration] createAstsFromFiles(set[loc] file, bool collectBindings, bool errorRecovery = false, list[loc] sourcePath = [], list[loc] classPath = [], Language javaVersion = JLS13()); @@ -321,9 +343,8 @@ public java Declaration createAstFromString(loc fileName, str source, bool colle @synopsis{Creates a set ASTs for all Java source files in a project using Eclipse's JDT compiler} @description{ - The function recursively looks for the `.java` files in the directory. - The function also looks for the dependencies (`.jar` files) to include them. - Wraps around ((createAstsFromFiles)). +Recursively looks for the `.java` files in the directory, and also looks for the dependencies (`.jar` files) to include them. +Wraps around ((createAstsFromFiles)). } public set[Declaration] createAstsFromDirectory(loc project, bool collectBindings, bool errorRecovery = false, Language javaVersion = JLS13() ) { if (!(isDirectory(project))) { From 2e29e7b35026dd58860b3422f638b8fc6aa5d009 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 17:36:39 +0200 Subject: [PATCH 046/134] added more missing nodes for type arguments and type parameters here and there; also removed passing null around here and there --- .../rascalmpl/library/lang/java/m3/AST.rsc | 14 ++- .../lang/java/m3/internal/ASTConverter.java | 106 +++++++++++++----- 2 files changed, 84 insertions(+), 36 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 494a731de7e..8ad9675b48f 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -138,11 +138,13 @@ data Expression(TypeSymbol typ=\unresolved()) | \newObject(Type \type, list[Declaration] typeParameters, list[Expression] args) | \qualifiedName(Expression qualifier, Expression expression) | \conditional(Expression expression, Expression thenBranch, Expression elseBranch) - | \fieldAccess(Expression expression, Expression name) + | \fieldAccess(Expression name) + | \fieldAccess(Expression qualifier, Expression name) | \superFieldAccess(Expression expression, Expression name) | \instanceof(Expression leftSide, Type rightSide) - | \methodCall(Expression receiver, str identifier, list[Expression] arguments) - | \superMethodCall(Expression receiver, str identifier, list[Expression] arguments) + | \methodCall(Expression receiver, list[Type] typeArguments, str identifier, list[Expression] arguments) + | \superMethodCall(list[Type] typeArguments, str identifier, list[Expression] arguments) + | \superMethodCall(Expression qualifier, list[Type] typeArguments, str identifier, list[Expression] arguments) | \null() | \number(str numberValue) | \booleanLiteral(str boolValue) @@ -153,7 +155,7 @@ data Expression(TypeSymbol typ=\unresolved()) | \variable(str identifier, list[Declaration] dimensionTypes, Expression \initializer) | \bracket(Expression expression) | \this() - | \this(Expression thisExpression) + | \this(Expression qualifier) | \super() | \declarationExpression(Declaration declaration) | \infix(Expression lhs, str operator, Expression rhs) @@ -205,8 +207,8 @@ data Statement | \expressionStatement(Expression stmt) | \constructorCall(Expression expr, list[Expression] arguments) | \constructorCall(list[Expression] arguments) - | \superConstructorCall(Expression expr, list[Expression] arguments) - | \superConstructorCall(list[Expression] arguments) + | \superConstructorCall(Expression expr, list[Type] typeArguments, list[Expression] arguments) + | \superConstructorCall(list[Type] typeArguments, list[Expression] arguments) | \yield(Expression argument) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 824a7d90b3d..bde9813dda2 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -591,14 +591,19 @@ public boolean visit(ForStatement node) { return false; } - // TODO: Jurgen was here while removing null passing to construct methods @Override public boolean visit(IfStatement node) { IValue booleanExpression = visitChild(node.getExpression()); IValue thenStatement = visitChild(node.getThenStatement()); - IValue elseStatement = node.getElseStatement() == null ? null : visitChild(node.getElseStatement()); - ownValue = constructStatementNode("if", booleanExpression, thenStatement, elseStatement); + if (node.getElseStatement() != null) { + IValue elseStatement = visitChild(node.getElseStatement()); + + ownValue = constructStatementNode("if", booleanExpression, thenStatement, elseStatement); + } + else { + ownValue = constructStatementNode("if", booleanExpression, thenStatement); + } return false; } @@ -761,20 +766,24 @@ public boolean visit(MethodDeclaration node) { IValue body = node.getBody() == null ? null : visitChild(node.getBody()); if (body == null && constructorName.equals("constructor")) { - body = constructStatementNode("empty"); + body = constructStatementNode("empty"); // TODO: what about the source location of this stub? } - ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done(), body); + if (body != null) { + ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done(), body); + } + else { + assert !constructorName.equals("constructor"); // constructors must have a body + ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done()); + } return false; } - public static final T getT() { - return null; - } + @Override public boolean visit(MethodInvocation node) { - IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); - + IValue expression = visitChild(node.getExpression()); + IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { @@ -793,20 +802,24 @@ public boolean visit(MethodInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("methodCall", expression, name, arguments.done()); - //setKeywordParameters("typeParameters", genericTypes); + ownValue = constructExpressionNode("methodCall", expression, genericTypes.done(), name, arguments.done()); + return false; } @Override public boolean visit(MethodRef node) { - // TODO: why is this not implemented? + // Because we do not implement the JavaDoc syntax and + // semantics, this reference to a method inside a JavaDoc comment + // does nothing for the moment. return false; } @Override public boolean visit(MethodRefParameter node) { - // TODO: why is this not implemented? + // Because we do not implement the JavaDoc syntax and + // semantics, this reference to a parameter of a method inside a JavaDoc comment + // does nothing for the moment. return false; } @@ -933,8 +946,13 @@ public boolean visit(QualifiedType node) { @Override public boolean visit(ReturnStatement node) { - IValue expression = node.getExpression() == null ? null : visitChild(node.getExpression()); - ownValue = constructStatementNode("return", expression); + if (node.getExpression() != null) { + IValue expression = visitChild(node.getExpression()); + ownValue = constructStatementNode("return", expression); + } + else { + ownValue = constructStatementNode("return"); + } return false; } @@ -973,6 +991,7 @@ public boolean visit(SingleVariableDeclaration node) { IValue type = visitChild(node.getType()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); + IList dimensions = ((List) node.extraDimensions()) .stream() .map(o -> (ASTNode) o) @@ -980,10 +999,16 @@ public boolean visit(SingleVariableDeclaration node) { .collect(values.listWriter()); if (node.getAST().apiLevel() >= AST.JLS3 && node.isVarargs()) { + assert initializer == null; ownValue = constructDeclarationNode("vararg", modifiers, type, name); } else { - ownValue = constructDeclarationNode("parameter", modifiers, type, name, dimensions, initializer); + if (initializer != null) { + ownValue = constructDeclarationNode("parameter", modifiers, type, name, dimensions, initializer); + } + else { + ownValue = constructDeclarationNode("parameter", modifiers, type, name, dimensions); + } } return false; @@ -995,10 +1020,6 @@ public boolean visit(Dimension node) { return false; } - int f(int a[][][]) { - return 0; - } - @Override public boolean visit(StringLiteral node) { IString escaped = values.string(node.getEscapedValue()); @@ -1073,8 +1094,13 @@ public boolean visit(SuperConstructorInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructStatementNode("superConstructorCall", expression, arguments.done()); - //setKeywordParameters("typeParameters", genericTypes); + if (expression != null) { + ownValue = constructStatementNode("superConstructorCall", expression, genericTypes.done(), arguments.done()); + } + else { + ownValue = constructStatementNode("superConstructorCall", genericTypes.done(), arguments.done()); + } + return false; } @@ -1083,7 +1109,12 @@ public boolean visit(SuperFieldAccess node) { IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); IValue name = visitChild(node.getName()); - ownValue = constructExpressionNode("fieldAccess", qualifier, name); + if (qualifier != null) { + ownValue = constructExpressionNode("fieldAccess", qualifier, name); + } + else { + ownValue = constructExpressionNode("fieldAccess", name); + } return false; } @@ -1110,8 +1141,13 @@ public boolean visit(SuperMethodInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("superMethodCall", qualifier, name, arguments.done()); - //setKeywordParameters("typeParameters", genericTypes); + if (qualifier != null) { + ownValue = constructExpressionNode("superMethodCall", qualifier, genericTypes.done(), name, arguments.done()); + } + else { + ownValue = constructExpressionNode("superMethodCall", genericTypes.done(), name, arguments.done()); + } + return false; } @@ -1303,9 +1339,14 @@ public boolean visit(TextElement node) { @Override public boolean visit(ThisExpression node) { - IValue qualifier = node.getQualifier() == null ? null : visitChild(node.getQualifier()); + if (node.getQualifier() != null) { + IValue qualifier = visitChild(node.getQualifier()); - ownValue = constructExpressionNode("this", qualifier); + ownValue = constructExpressionNode("this", qualifier); + } + else { + ownValue = constructExpressionNode("this"); + } return false; } @@ -1329,9 +1370,14 @@ public boolean visit(TryStatement node) { catchClauses.append(visitChild(cc)); } - IValue finallyBlock = node.getFinally() == null ? null : visitChild(node.getFinally()); + if (node.getFinally() != null) { + IValue finallyBlock = visitChild(node.getFinally()); - ownValue = constructStatementNode("try", body, catchClauses.done(), finallyBlock); + ownValue = constructStatementNode("try", body, catchClauses.done(), finallyBlock); + } + else { + ownValue = constructStatementNode("try", body, catchClauses.done()); + } return false; } From a06112f018688a59a28a43503e3c064575fde441 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 17:45:24 +0200 Subject: [PATCH 047/134] fixed more missing type parameter stuff and more null passing --- .../rascalmpl/library/lang/java/m3/AST.rsc | 9 +++--- .../lang/java/m3/internal/ASTConverter.java | 28 ++++++++++++------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 8ad9675b48f..50ea6557a81 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -205,8 +205,7 @@ data Statement | \declarationStatement(Declaration declaration) | \while(Expression condition, Statement body) | \expressionStatement(Expression stmt) - | \constructorCall(Expression expr, list[Expression] arguments) - | \constructorCall(list[Expression] arguments) + | \constructorCall(list[Type] typeArguments, list[Expression] arguments) | \superConstructorCall(Expression expr, list[Type] typeArguments, list[Expression] arguments) | \superConstructorCall(list[Type] typeArguments, list[Expression] arguments) | \yield(Expression argument) @@ -220,9 +219,9 @@ data Type | simpleType(Expression typeName) | unionType(list[Type] types) | intersectionType(list[Type] types) // TODO: aren't union types also sometimes present in catch clauses? - | wildcard() - | super(Type \type) - | extends(Type \type) + | wildcard(list[Modifier] annotations) + | super(list[Modifier] annotations, Type \type) + | extends(list[Modifier] annotations, Type \type) | \int() | short() | long() diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index bde9813dda2..ee723a0ef54 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -77,6 +77,7 @@ else if (node instanceof ModuleDeclaration) { System.err.println("Got NPE for node " + node + ((e.getStackTrace().length > 0) ? ("\n\t" + e.getStackTrace()[0]) : "")); } + assert false; return null; } @@ -102,7 +103,10 @@ public void preVisit(ASTNode node) { } } else { - ownAnnotations = null; + // This {sh,w}ould trigger downstream non-null assertions if someone tries + // to include annotations into a non-annotable syntax node. + // Otherwise this field should not be referenced until it is set here above again. + ownAnnotations = null; } // many nodes also have modifiers @@ -114,6 +118,9 @@ public void preVisit(ASTNode node) { .collect(values.listWriter()); } else { + // This {sh,w}ould trigger downstream non-null assertions if someone tries + // to include modifiers into a non-modifiable syntax node. + // Otherwise this field should not be referenced until it is set here above again. ownModifiers = null; } } @@ -361,7 +368,7 @@ public boolean visit(ClassInstanceCreation node) { ownValue = constructExpressionNode("newObject", type, genericTypes.done(), arguments.done()); } } - //setKeywordParameters("typeParameters", genericTypes); + return false; } @@ -426,8 +433,7 @@ public boolean visit(ConstructorInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructStatementNode("constructorCall", arguments.done()); - //setKeywordParameters("typeParameters", types); + ownValue = constructStatementNode("constructorCall", types.done(), arguments.done()); return false; } @@ -1527,14 +1533,14 @@ public boolean visit(VariableDeclarationExpression node) { public boolean visit(VariableDeclarationFragment node) { IValue name = values.string(node.getName().getFullyQualifiedName()); - IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); IList dimensions = ((List) node.extraDimensions()) .stream() .map(o -> (ASTNode) o) .map(d -> visitChild(d)) .collect(values.listWriter()); - if (initializer != null) { + if (node.getInitializer() != null) { + IValue initializer = visitChild(node.getInitializer()); ownValue = constructExpressionNode("variable", name, dimensions, initializer); } else { @@ -1576,20 +1582,22 @@ public boolean visit(WhileStatement node) { @Override public boolean visit(WildcardType node) { - //FIXME: upperbound/lowerbound that should have been type annotation are replaced by TypeSymbol - IValue type = null; String name = "wildcard"; if (node.getBound() != null) { - type = visitChild(node.getBound()); + var bound = visitChild(node.getBound()); if (node.isUpperBound()) { name = "extends"; } else { name = "super"; } + + ownValue = constructTypeNode(name, ownAnnotations, bound); + } + else { + ownValue = constructTypeNode(name, ownAnnotations); } - ownValue = constructTypeNode(name, type); return false; } From b0b5219cbbbc10d70a5c109b77f3dd5ff9e8ccae Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 17:47:10 +0200 Subject: [PATCH 048/134] added missing type parameters for the parameterizedType constructor --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 2 +- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 50ea6557a81..07ed7f60f43 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -214,7 +214,7 @@ data Statement @synopsis{These are the literal types you can find in Java programs.} data Type = arrayType(Type \type) - | parameterizedType(Type \type) + | parameterizedType(Type \type, list[Type] typeArguments) | qualifiedType(Type qualifier, Expression simpleName) | simpleType(Expression typeName) | unionType(list[Type] types) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index ee723a0ef54..38ebaedfa37 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -886,8 +886,8 @@ public boolean visit(ParameterizedType node) { genericTypes.append(visitChild(t)); } - ownValue = constructTypeNode("parameterizedType", type); - //setKeywordParameters("typeParameters", genericTypes); + ownValue = constructTypeNode("parameterizedType", type, genericTypes.done()); + return false; } From 1650043511ef3de68dc279cffd09207859cc3fd6 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 17:49:30 +0200 Subject: [PATCH 049/134] fixed all raw type warnings for iterators in ASTConverter --- .../lang/java/m3/internal/ASTConverter.java | 90 +++++++++---------- 1 file changed, 43 insertions(+), 47 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 38ebaedfa37..a51b822f90c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -15,7 +15,6 @@ import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; -@SuppressWarnings({"rawtypes"}) public class ASTConverter extends JavaToRascalConverter { /* * TODO: @@ -132,7 +131,7 @@ public boolean visit(AnnotationTypeDeclaration node) { IValue name = visitChild(node.getName()); IListWriter bodyDeclarations = values.listWriter(); - for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { + for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration d = (BodyDeclaration) it.next(); bodyDeclarations.append(visitChild(d)); } @@ -164,7 +163,7 @@ public boolean visit(AnnotationTypeMemberDeclaration node) { public boolean visit(AnonymousClassDeclaration node) { IListWriter bodyDeclarations = values.listWriter(); - for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { + for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration b = (BodyDeclaration) it.next(); bodyDeclarations.append(visitChild(b)); } @@ -188,7 +187,7 @@ public boolean visit(ArrayCreation node) { IValue type = visitChild(node.getType().getElementType()); IListWriter dimensions = values.listWriter(); - for (Iterator it = node.dimensions().iterator(); it.hasNext();) { + for (Iterator it = node.dimensions().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); dimensions.append(visitChild(e)); } @@ -207,7 +206,7 @@ public boolean visit(ArrayCreation node) { @Override public boolean visit(ArrayInitializer node) { IListWriter expressions = values.listWriter(); - for (Iterator it = node.expressions().iterator(); it.hasNext();) { + for (Iterator it = node.expressions().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); expressions.append(visitChild(e)); } @@ -254,7 +253,7 @@ public boolean visit(Assignment node) { @Override public boolean visit(Block node) { IListWriter statements = values.listWriter(); - for (Iterator it = node.statements().iterator(); it.hasNext();) { + for (Iterator it = node.statements().iterator(); it.hasNext();) { Statement s = (Statement) it.next(); statements.append(visitChild(s)); } @@ -337,7 +336,7 @@ public boolean visit(ClassInstanceCreation node) { type = visitChild(node.getType()); if (!node.typeArguments().isEmpty()) { - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { + for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); genericTypes.append(visitChild(t)); } @@ -345,7 +344,7 @@ public boolean visit(ClassInstanceCreation node) { } IListWriter arguments = values.listWriter(); - for (Iterator it = node.arguments().iterator(); it.hasNext();) { + for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); } @@ -382,13 +381,13 @@ public boolean visit(CompilationUnit node) { IValue packageOfUnit = node.getPackage() == null ? null : visitChild(node.getPackage()); IListWriter imports = values.listWriter(); - for (Iterator it = node.imports().iterator(); it.hasNext();) { + for (Iterator it = node.imports().iterator(); it.hasNext();) { ImportDeclaration d = (ImportDeclaration) it.next(); imports.append(visitChild(d)); } IListWriter typeDeclarations = values.listWriter(); - for (Iterator it = node.types().iterator(); it.hasNext();) { + for (Iterator it = node.types().iterator(); it.hasNext();) { AbstractTypeDeclaration d = (AbstractTypeDeclaration) it.next(); typeDeclarations.append(visitChild(d)); } @@ -420,7 +419,7 @@ public boolean visit(ConstructorInvocation node) { IListWriter types = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { + for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); types.append(visitChild(t)); } @@ -428,7 +427,7 @@ public boolean visit(ConstructorInvocation node) { } IListWriter arguments = values.listWriter(); - for (Iterator it = node.arguments().iterator(); it.hasNext();) { + for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); } @@ -486,7 +485,7 @@ public boolean visit(EnumConstantDeclaration node) { IListWriter arguments = values.listWriter(); if (!node.arguments().isEmpty()) { - for (Iterator it = node.arguments().iterator(); it.hasNext();) { + for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); } @@ -510,21 +509,21 @@ public boolean visit(EnumDeclaration node) { IListWriter implementedInterfaces = values.listWriter(); if (!node.superInterfaceTypes().isEmpty()) { - for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { + for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { Type t = (Type) it.next(); implementedInterfaces.append(visitChild(t)); } } IListWriter enumConstants = values.listWriter(); - for (Iterator it = node.enumConstants().iterator(); it.hasNext();) { + for (Iterator it = node.enumConstants().iterator(); it.hasNext();) { EnumConstantDeclaration d = (EnumConstantDeclaration) it.next(); enumConstants.append(visitChild(d)); } IListWriter bodyDeclarations = values.listWriter(); if (!node.bodyDeclarations().isEmpty()) { - for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { + for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration d = (BodyDeclaration) it.next(); bodyDeclarations.append(visitChild(d)); } @@ -559,7 +558,7 @@ public boolean visit(FieldDeclaration node) { IValue type = visitChild(node.getType()); IListWriter fragments = values.listWriter(); - for (Iterator it = node.fragments().iterator(); it.hasNext();) { + for (Iterator it = node.fragments().iterator(); it.hasNext();) { VariableDeclarationFragment f = (VariableDeclarationFragment) it.next(); fragments.append(visitChild(f)); } @@ -572,7 +571,7 @@ public boolean visit(FieldDeclaration node) { @Override public boolean visit(ForStatement node) { IListWriter initializers = values.listWriter(); - for (Iterator it = node.initializers().iterator(); it.hasNext();) { + for (Iterator it = node.initializers().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); initializers.append(visitChild(e)); } @@ -580,7 +579,7 @@ public boolean visit(ForStatement node) { IValue booleanExpression = node.getExpression() == null ? null : visitChild(node.getExpression()); IListWriter updaters = values.listWriter(); - for (Iterator it = node.updaters().iterator(); it.hasNext();) { + for (Iterator it = node.updaters().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); updaters.append(visitChild(e)); } @@ -640,7 +639,7 @@ public boolean visit(InfixExpression node) { IValue rightSide = visitChild(node.getRightOperand()); IValue intermediateExpression = constructExpressionNode("infix", leftSide, operator, rightSide); - for (Iterator it = node.extendedOperands().iterator(); it.hasNext();) { + for (Iterator it = node.extendedOperands().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); intermediateExpression = constructExpressionNode("infix", intermediateExpression, operator, visitChild(e)); } @@ -721,7 +720,7 @@ public boolean visit(MethodDeclaration node) { IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeParameters().isEmpty()) { - for (Iterator it = node.typeParameters().iterator(); it.hasNext();) { + for (Iterator it = node.typeParameters().iterator(); it.hasNext();) { TypeParameter t = (TypeParameter) it.next(); genericTypes.append(visitChild(t)); } @@ -745,7 +744,7 @@ public boolean visit(MethodDeclaration node) { IValue name = visitChild(node.getName()); IListWriter parameters = values.listWriter(); - for (Iterator it = node.parameters().iterator(); it.hasNext();) { + for (Iterator it = node.parameters().iterator(); it.hasNext();) { SingleVariableDeclaration v = (SingleVariableDeclaration) it.next(); parameters.append(visitChild(v)); } @@ -755,7 +754,7 @@ public boolean visit(MethodDeclaration node) { var apiLevel = node.getAST().apiLevel(); if (apiLevel == AST.JLS2 || apiLevel == AST.JLS3 || apiLevel == AST.JLS4) { if (!node.thrownExceptions().isEmpty()) { - for (Iterator it = node.thrownExceptions().iterator(); it.hasNext();) { + for (Iterator it = node.thrownExceptions().iterator(); it.hasNext();) { Name n = (Name) it.next(); possibleExceptions.append(visitChild(n)); } @@ -793,7 +792,7 @@ public boolean visit(MethodInvocation node) { IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { + for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); genericTypes.append(visitChild(t)); } @@ -803,7 +802,7 @@ public boolean visit(MethodInvocation node) { IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); - for (Iterator it = node.arguments().iterator(); it.hasNext();) { + for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); } @@ -842,7 +841,7 @@ public boolean visit(NormalAnnotation node) { IValue typeName = visitChild(node.getTypeName()); IListWriter memberValuePairs = values.listWriter(); - for (Iterator it = node.values().iterator(); it.hasNext();) { + for (Iterator it = node.values().iterator(); it.hasNext();) { MemberValuePair p = (MemberValuePair) it.next(); memberValuePairs.append(visitChild(p)); } @@ -881,7 +880,7 @@ public boolean visit(ParameterizedType node) { IValue type = visitChild(node.getType()); IListWriter genericTypes = values.listWriter(); - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { + for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); genericTypes.append(visitChild(t)); } @@ -930,7 +929,6 @@ public boolean visit(PrimitiveType node) { public boolean visit(QualifiedName node) { IValue qualifier = visitChild(node.getQualifier()); - IValue name = visitChild(node.getName()); ownValue = constructExpressionNode("qualifiedName", qualifier, name); @@ -942,7 +940,6 @@ public boolean visit(QualifiedName node) { public boolean visit(QualifiedType node) { IValue qualifier = visitChild(node.getQualifier()); - IValue name = visitChild(node.getName()); ownValue = constructTypeNode("qualifiedType", qualifier, name); @@ -1056,7 +1053,7 @@ public boolean visit(YieldStatement node) { @Override public boolean visit(LambdaExpression node) { IListWriter parameters = values.listWriter(); - for (Iterator it = node.parameters().iterator(); it.hasNext();) { + for (Iterator it = node.parameters().iterator(); it.hasNext();) { SingleVariableDeclaration v = (SingleVariableDeclaration) it.next(); parameters.append(visitChild(v)); } @@ -1070,7 +1067,7 @@ public boolean visit(SwitchExpression node) { IValue expression = visitChild(node.getExpression()); IListWriter statements = values.listWriter(); - for (Iterator it = node.statements().iterator(); it.hasNext();) { + for (Iterator it = node.statements().iterator(); it.hasNext();) { Statement s = (Statement) it.next(); statements.append(visitChild(s)); } @@ -1087,7 +1084,7 @@ public boolean visit(SuperConstructorInvocation node) { IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { + for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); genericTypes.append(visitChild(t)); } @@ -1095,7 +1092,7 @@ public boolean visit(SuperConstructorInvocation node) { } IListWriter arguments = values.listWriter(); - for (Iterator it = node.arguments().iterator(); it.hasNext();) { + for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); } @@ -1132,7 +1129,7 @@ public boolean visit(SuperMethodInvocation node) { IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { - for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { + for (Iterator it = node.typeArguments().iterator(); it.hasNext();) { Type t = (Type) it.next(); genericTypes.append(visitChild(t)); } @@ -1142,7 +1139,7 @@ public boolean visit(SuperMethodInvocation node) { IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); - for (Iterator it = node.arguments().iterator(); it.hasNext();) { + for (Iterator it = node.arguments().iterator(); it.hasNext();) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); } @@ -1309,7 +1306,7 @@ public boolean visit(SwitchStatement node) { IValue expression = visitChild(node.getExpression()); IListWriter statements = values.listWriter(); - for (Iterator it = node.statements().iterator(); it.hasNext();) { + for (Iterator it = node.statements().iterator(); it.hasNext();) { Statement s = (Statement) it.next(); statements.append(visitChild(s)); } @@ -1371,7 +1368,7 @@ public boolean visit(TryStatement node) { IValue body = visitChild(node.getBody()); IListWriter catchClauses = values.listWriter(); - for (Iterator it = node.catchClauses().iterator(); it.hasNext();) { + for (Iterator it = node.catchClauses().iterator(); it.hasNext();) { CatchClause cc = (CatchClause) it.next(); catchClauses.append(visitChild(cc)); } @@ -1398,7 +1395,7 @@ public boolean visit(TypeDeclaration node) { IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeParameters().isEmpty()) { - for (Iterator it = node.typeParameters().iterator(); it.hasNext();) { + for (Iterator it = node.typeParameters().iterator(); it.hasNext();) { TypeParameter t = (TypeParameter) it.next(); genericTypes.append(visitChild(t)); } @@ -1413,7 +1410,7 @@ public boolean visit(TypeDeclaration node) { extendsClass.append(visitChild(node.getSuperclass())); } if (!node.superInterfaces().isEmpty()) { - for (Iterator it = node.superInterfaces().iterator(); it.hasNext();) { + for (Iterator it = node.superInterfaces().iterator(); it.hasNext();) { Name n = (Name) it.next(); implementsInterfaces.append(visitChild(n)); } @@ -1423,7 +1420,7 @@ public boolean visit(TypeDeclaration node) { extendsClass.append(visitChild(node.getSuperclassType())); } if (!node.superInterfaceTypes().isEmpty()) { - for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { + for (Iterator it = node.superInterfaceTypes().iterator(); it.hasNext();) { Type t = (Type) it.next(); implementsInterfaces.append(visitChild(t)); } @@ -1431,7 +1428,7 @@ public boolean visit(TypeDeclaration node) { } IListWriter bodyDeclarations = values.listWriter(); - for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { + for (Iterator it = node.bodyDeclarations().iterator(); it.hasNext();) { BodyDeclaration d = (BodyDeclaration) it.next(); bodyDeclarations.append(visitChild(d)); } @@ -1472,7 +1469,7 @@ public boolean visit(TypeParameter node) { IListWriter extendsList = values.listWriter(); if (!node.typeBounds().isEmpty()) { - for (Iterator it = node.typeBounds().iterator(); it.hasNext();) { + for (Iterator it = node.typeBounds().iterator(); it.hasNext();) { Type t = (Type) it.next(); extendsList.append(visitChild(t)); } @@ -1486,7 +1483,7 @@ public boolean visit(TypeParameter node) { @Override public boolean visit(UnionType node) { IListWriter typesValues = values.listWriter(); - for(Iterator types = node.types().iterator(); types.hasNext();) { + for(Iterator types = node.types().iterator(); types.hasNext();) { Type type = (Type) types.next(); typesValues.append(visitChild(type)); } @@ -1499,7 +1496,7 @@ public boolean visit(UnionType node) { @Override public boolean visit(IntersectionType node) { IListWriter typesValues = values.listWriter(); - for(Iterator types = node.types().iterator(); types.hasNext();) { + for(Iterator types = node.types().iterator(); types.hasNext();) { Type type = (Type) types.next(); typesValues.append(visitChild(type)); } @@ -1516,7 +1513,7 @@ public boolean visit(VariableDeclarationExpression node) { IValue type = visitChild(node.getType()); IListWriter fragments = values.listWriter(); - for (Iterator it = node.fragments().iterator(); it.hasNext();) { + for (Iterator it = node.fragments().iterator(); it.hasNext();) { VariableDeclarationFragment f = (VariableDeclarationFragment) it.next(); fragments.append(visitChild(f)); } @@ -1525,7 +1522,6 @@ public boolean visit(VariableDeclarationExpression node) { ownValue = constructDeclarationNode("variables", modifiers, type, fragments.done()); ownValue = constructExpressionNode("declarationExpression", ownValue); - return false; } @@ -1558,7 +1554,7 @@ public boolean visit(VariableDeclarationStatement node) { IValue type = visitChild(node.getType()); IListWriter fragments = values.listWriter(); - for (Iterator it = node.fragments().iterator(); it.hasNext();) { + for (Iterator it = node.fragments().iterator(); it.hasNext();) { VariableDeclarationFragment f = (VariableDeclarationFragment) it.next(); fragments.append(visitChild(f)); } From 815b77996569691b014f92d51e1ed268d695caa3 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 17:58:42 +0200 Subject: [PATCH 050/134] removed dead comments and adding documentation --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 2 +- .../lang/java/m3/internal/ASTConverter.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 07ed7f60f43..1e33bdf02a3 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -218,7 +218,7 @@ data Type | qualifiedType(Type qualifier, Expression simpleName) | simpleType(Expression typeName) | unionType(list[Type] types) - | intersectionType(list[Type] types) // TODO: aren't union types also sometimes present in catch clauses? + | intersectionType(list[Type] types) | wildcard(list[Modifier] annotations) | super(list[Modifier] annotations, Type \type) | extends(list[Modifier] annotations, Type \type) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index a51b822f90c..2ff8118aed0 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -15,12 +15,20 @@ import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; +/** + * This big visitor class has a case for every type of AST node in the JDT's core DOM model. + * Each visit method maps the JDT DOM model to the M3 AST model as defined in lang::java::m3::AST. + * + * If names can be resolved, they will be, and lead to `decl=` parameters on the declarations and uses. + * If types can be resolved, they will be interpreted as TypeSymbol's and stored on the AST nodes as `typ=` parameters. + * All nodes get `src=` parameters pointing to their exact location in the source file. + * + * Otherwise the goal of this code is to satisfy the "AST correctness" specification in analysis::m3::AST, + * and the documentation written in lang::java::m3::AST. This means that the recovery is complete and completely + * specific, and all node src locations point to exactly the the right input subsentences. + */ public class ASTConverter extends JavaToRascalConverter { - /* - * TODO: - * Type parameters need to come out of annotations - * calls may need to be broken up into superconstructor, constructor, supermethod, method calls or separate them in bindings - */ + public ASTConverter(final LimitedTypeStore typeStore, Map cache, boolean collectBindings) { super(typeStore, cache, collectBindings); } From 1811f62e4ec228cfeb3ff4ecb02f9712247c607b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 19:38:42 +0200 Subject: [PATCH 051/134] added some missing headers and removed the null filtering code that is now unused, and also the reparsing of modifiers that is now unused --- .../lang/java/m3/internal/ASTConverter.java | 14 +++ .../m3/internal/JavaToRascalConverter.java | 98 ++++++++----------- 2 files changed, 53 insertions(+), 59 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 2ff8118aed0..66cc92ffe90 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1,3 +1,17 @@ +/******************************************************************************* + * Copyright (c) 2009-2024 CWI + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * * Ashim Shahi + * * Jurgen Vinju + * * Jouke Stoel + * * Lina María Ochoa Venegas + * * Davy Landman +*******************************************************************************/ package org.rascalmpl.library.lang.java.m3.internal; import java.util.Arrays; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 88931a560f6..7c7c2100f90 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -1,18 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2009-2024 CWI + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * * Ashim Shahi + * * Jurgen Vinju + * * Jouke Stoel + * * Lina María Ochoa Venegas + * * Davy Landman +*******************************************************************************/ package org.rascalmpl.library.lang.java.m3.internal; import java.net.URISyntaxException; -import java.util.Arrays; -import java.util.Iterator; -import java.util.List; import java.util.Map; -import java.util.Set; - import org.eclipse.jdt.core.compiler.IProblem; -import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; -import org.eclipse.jdt.core.dom.Annotation; -import org.eclipse.jdt.core.dom.BodyDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -29,6 +35,10 @@ import io.usethesource.vallang.type.Type; import io.usethesource.vallang.type.TypeFactory; +/** + * This is a utility abstract class with reusable infrastructor for the bridge between + * the JDT DOM and Rascal models (AST's or M3 databases). + */ public abstract class JavaToRascalConverter extends ASTVisitor { protected static final IValueFactory values = ValueFactoryFactory.getValueFactory(); protected static final TypeFactory TF = TypeFactory.getInstance(); @@ -129,7 +139,7 @@ public ISourceLocation resolveBinding(String packageC) { return packageBinding; } - protected final ISourceLocation resolveBinding(CompilationUnit node) { + protected final ISourceLocation resolveBinding(CompilationUnit node) { ISourceLocation compilationUnit = new BindingsResolver(typeStore, locationCache, true) { public ISourceLocation resolveBinding(CompilationUnit node) { return makeBinding("java+compilationUnit", null, loc.getPath()); @@ -150,11 +160,14 @@ protected ISourceLocation resolveDeclaringClass(IBinding binding) { ISourceLocation resolvedBinding; if (binding instanceof ITypeBinding) { resolvedBinding = bindingsResolver.resolveBinding(((ITypeBinding) binding).getDeclaringClass()); - } else if (binding instanceof IMethodBinding) { + } + else if (binding instanceof IMethodBinding) { resolvedBinding = bindingsResolver.resolveBinding(((IMethodBinding) binding).getDeclaringClass()); - } else if (binding instanceof IVariableBinding) { + } + else if (binding instanceof IVariableBinding) { resolvedBinding = bindingsResolver.resolveBinding(((IVariableBinding) binding).getDeclaringClass()); - } else { + } + else { binding = null; resolvedBinding = bindingsResolver.resolveBinding(binding); } @@ -189,7 +202,7 @@ protected ISourceLocation getSourceLocation(ASTNode node) { start, nodeLength, compilUnit.getLineNumber(start), compilUnit.getLineNumber(end), // TODO: only adding 1 at the end seems to work, need to test. - compilUnit.getColumnNumber(start), compilUnit.getColumnNumber(end)+1); + compilUnit.getColumnNumber(start), compilUnit.getColumnNumber(end) + 1); } } catch (IllegalArgumentException e) { insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, @@ -199,41 +212,8 @@ protected ISourceLocation getSourceLocation(ASTNode node) { return values.sourceLocation(loc, 0, 0, 0, 0, 0, 0); } - protected IValue[] removeNulls(IValue... withNulls) { - return Arrays.stream(withNulls) - .filter(e -> e != null) - .toArray(IValue[]::new); - } - - protected IList parseModifiers(int modifiers) { - IListWriter extendedModifierList = values.listWriter(); - - - for (String constructor: java.lang.reflect.Modifier.toString(modifiers).split(" ")) { - Set exConstr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE, constructor); - for (io.usethesource.vallang.type.Type con: exConstr) { - extendedModifierList.append(values.constructor(con)); - } - } - - return extendedModifierList.done(); - } - - @SuppressWarnings({"rawtypes"}) - protected IList parseExtendedModifiers(List ext) { - IListWriter extendedModifierList = values.listWriter(); - - for (Iterator it = ext.iterator(); it.hasNext();) { - ASTNode p = (ASTNode) it.next(); - IValue val = visitChild(p); - if (p instanceof Annotation) { - val = constructModifierNode("annotation", val); - } - extendedModifierList.append(val); - } - return extendedModifierList.done(); - } - + /* unused */ + /* protected IList parseExtendedModifiers(BodyDeclaration node) { if (node.getAST().apiLevel() == AST.JLS2) { return parseModifiers(node.getModifiers()); @@ -241,6 +221,7 @@ protected IList parseExtendedModifiers(BodyDeclaration node) { return parseExtendedModifiers(node.modifiers()); } } + */ protected IValue visitChild(ASTNode node) { node.accept(this); @@ -252,9 +233,9 @@ public IValue getValue() { } protected IConstructor constructModifierNode(String constructor, IValue... children) { - io.usethesource.vallang.type.Type args = TF.tupleType(removeNulls(children)); + io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE, constructor, args); - return values.constructor(constr, removeNulls(children)); + return values.constructor(constr, children); } protected void setKeywordParameter(String label, IValue value) { @@ -276,30 +257,29 @@ protected void setKeywordParameters(String label, IList values) { } protected IValue constructDeclarationNode(String constructor, IValue... children) { - io.usethesource.vallang.type.Type args = TF.tupleType(removeNulls(children)); + io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_DECLARATION_NODE_TYPE, constructor, args); - return values.constructor(constr, removeNulls(children)); + return values.constructor(constr, children); } protected IValue constructExpressionNode(String constructor, IValue... children) { - io.usethesource.vallang.type.Type args = TF.tupleType(removeNulls(children)); + io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_EXPRESSION_NODE_TYPE, constructor, args); - return values.constructor(constr, removeNulls(children)); + return values.constructor(constr, children); } protected IValue constructStatementNode(String constructor, IValue... children) { - io.usethesource.vallang.type.Type args = TF.tupleType(removeNulls(children)); + io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE, constructor, args); - return values.constructor(constr, removeNulls(children)); + return values.constructor(constr, children); } protected IValue constructTypeNode(String constructor, IValue... children) { - io.usethesource.vallang.type.Type args = TF.tupleType(removeNulls(children)); + io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_TYPE_NODE_TYPE, constructor, args); - return values.constructor(constr, removeNulls(children)); + return values.constructor(constr, children); } - protected Type getAdtType() { if (ownValue == null) { return TF.voidType(); From a2375ce65799d8d12058aacf9cba795b0ae45e45 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 19:44:45 +0200 Subject: [PATCH 052/134] fixed bug --- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 3 ++- .../library/lang/java/m3/internal/EclipseJavaCompiler.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 66cc92ffe90..183c4772bc0 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -93,7 +93,8 @@ else if (node instanceof ModuleDeclaration) { IModuleBinding binding = ((ModuleDeclaration) node).resolveBinding(); return bindingsResolver.resolveType(binding, true); } - } catch (NullPointerException e) { + } + catch (NullPointerException e) { // TODO: log this in a better way System.err.println("Got NPE for node " + node + ((e.getStackTrace().length > 0) ? ("\n\t" + e.getStackTrace()[0]) : "")); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index a823bd1e5ac..feff2b56dae 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -308,7 +308,7 @@ protected ASTParser constructASTParser(boolean resolveBindings, boolean errorRec Hashtable options = new Hashtable(); options.put(JavaCore.COMPILER_SOURCE, ((IString) javaVersion.asWithKeywordParameters().getParameter("version")).getValue()); - options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.get("version")).getValue()); + options.put(JavaCore.COMPILER_COMPLIANCE, ((IString) javaVersion.asWithKeywordParameters().getParameter("version")).getValue()); options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, previewParameter.getValue() ? JavaCore.ENABLED : JavaCore.DISABLED); options.put(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, JavaCore.ENABLED); From 459981e93b07e224301afe1aeb69b114530e5976 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 22 Apr 2024 19:59:22 +0200 Subject: [PATCH 053/134] running the new code and fixing every minor slipup --- .../lang/java/m3/internal/ASTConverter.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 183c4772bc0..04d8aece2f3 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -99,7 +99,7 @@ else if (node instanceof ModuleDeclaration) { System.err.println("Got NPE for node " + node + ((e.getStackTrace().length > 0) ? ("\n\t" + e.getStackTrace()[0]) : "")); } - assert false; + // some nodes do not have a type return null; } @@ -114,10 +114,15 @@ public void preVisit(ASTNode node) { IAnnotatable annotable = (IAnnotatable) node; try { - ownAnnotations = Arrays.stream(annotable.getAnnotations()) - .map(o -> (ASTNode) o) - .map(a -> visitChild(a)) - .collect(values.listWriter()); + if (annotable.getAnnotations() == null) { + ownAnnotations = values.list(); + } + else { + ownAnnotations = Arrays.stream(annotable.getAnnotations()) + .map(o -> (ASTNode) o) + .map(a -> visitChild(a)) + .collect(values.listWriter()); + } } catch (JavaModelException e) { // TODO: log this in a better way @@ -893,11 +898,21 @@ public boolean visit(NumberLiteral node) { @Override public boolean visit(PackageDeclaration node) { IValue name = visitChild(node.getName()); - ownValue = constructDeclarationNode("package", ownAnnotations, name); + IList annotations = mapAnnotations(node.annotations()); + + ownValue = constructDeclarationNode("package", annotations, name); return false; } + private IList mapAnnotations(List annotations) { + return annotations + .stream() + .map(o -> (ASTNode) o) + .map(a -> visitChild(a)) + .collect(values.listWriter()); + } + @Override public boolean visit(ParameterizedType node) { IValue type = visitChild(node.getType()); From f9604679db6d49cc4d480e2128d292e5366ea110 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 12:04:31 +0200 Subject: [PATCH 054/134] alignment between ASTConverter and AST.rsc improved --- .../rascalmpl/library/lang/java/m3/AST.rsc | 15 ++++++------ .../lang/java/m3/internal/ASTConverter.java | 24 +++++++++---------- .../m3/internal/JavaToRascalConverter.java | 18 ++++++++++++++ 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 1e33bdf02a3..e6ea744059b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -92,13 +92,13 @@ data Declaration | \enum(list[Modifier] modifiers, Expression name, list[Type] implements, list[Declaration] constants, list[Declaration] body) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments, Declaration class) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments) - | \class(list[Modifier] modifiers, Expression name, list[Type] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) + | \class(list[Modifier] modifiers, Expression name, list[Declaration] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \class(list[Modifier] modifiers, list[Declaration] body) - | \interface(list[Modifier] modifiers, Expression name, list[Type] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) + | \interface(list[Modifier] modifiers, Expression name, list[Declaration] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \field(list[Modifier] modifiers, Type \type, list[Expression] fragments) | \initializer(list[Modifier] modifiers, Statement initializerBody) - | \method(list[Modifier] modifiers, list[Type] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) - | \method(list[Modifier] modifiers, list[Type] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) + | \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) + | \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) | \constructor(list[Modifier] modifiers, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) | \import(Expression name) | \package(list[Modifier] modifiers, Expression name) @@ -142,9 +142,10 @@ data Expression(TypeSymbol typ=\unresolved()) | \fieldAccess(Expression qualifier, Expression name) | \superFieldAccess(Expression expression, Expression name) | \instanceof(Expression leftSide, Type rightSide) - | \methodCall(Expression receiver, list[Type] typeArguments, str identifier, list[Expression] arguments) - | \superMethodCall(list[Type] typeArguments, str identifier, list[Expression] arguments) - | \superMethodCall(Expression qualifier, list[Type] typeArguments, str identifier, list[Expression] arguments) + | \methodCall(list[Type] typeArguments, Expression name, list[Expression] arguments) + | \methodCall(Expression receiver, list[Type] typeArguments, Expression name, list[Expression] arguments) + | \superMethodCall(list[Type] typeArguments, Expression name, list[Expression] arguments) + | \superMethodCall(Expression qualifier, list[Type] typeArguments, Expression name, list[Expression] arguments) | \null() | \number(str numberValue) | \booleanLiteral(str boolValue) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 04d8aece2f3..7fa04718619 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -110,6 +110,8 @@ public void preVisit(ASTNode node) { // out the AST construction code of all of those visit methods. // Still every such method must put the ownAnnotations list at the right place in their constructor. + System.err.println("Now converting: " + getSourceLocation(node)); + if (node instanceof IAnnotatable) { IAnnotatable annotable = (IAnnotatable) node; @@ -815,8 +817,6 @@ public boolean visit(MethodDeclaration node) { @Override public boolean visit(MethodInvocation node) { - IValue expression = visitChild(node.getExpression()); - IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { if (!node.typeArguments().isEmpty()) { @@ -835,7 +835,13 @@ public boolean visit(MethodInvocation node) { arguments.append(visitChild(e)); } - ownValue = constructExpressionNode("methodCall", expression, genericTypes.done(), name, arguments.done()); + if (node.getExpression() != null) { + IValue expression = visitChild(node.getExpression()); + ownValue = constructExpressionNode("methodCall", expression, genericTypes.done(), name, arguments.done()); + } + else { + ownValue = constructExpressionNode("methodCall", genericTypes.done(), name, arguments.done()); + } return false; } @@ -898,21 +904,13 @@ public boolean visit(NumberLiteral node) { @Override public boolean visit(PackageDeclaration node) { IValue name = visitChild(node.getName()); - IList annotations = mapAnnotations(node.annotations()); + IList annotations = visitChildren(node.annotations()); ownValue = constructDeclarationNode("package", annotations, name); return false; } - private IList mapAnnotations(List annotations) { - return annotations - .stream() - .map(o -> (ASTNode) o) - .map(a -> visitChild(a)) - .collect(values.listWriter()); - } - @Override public boolean visit(ParameterizedType node) { IValue type = visitChild(node.getType()); @@ -1425,7 +1423,7 @@ public boolean visit(TryStatement node) { @Override public boolean visit(TypeDeclaration node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); String objectType = node.isInterface() ? "interface" : "class"; IValue name = visitChild(node.getName()); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 7c7c2100f90..9037c38f19a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -15,6 +15,8 @@ package org.rascalmpl.library.lang.java.m3.internal; import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.List; import java.util.Map; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.ASTNode; @@ -228,6 +230,18 @@ protected IValue visitChild(ASTNode node) { return this.getValue(); } + protected IList visitChildren(List childrenList) { + if (childrenList == null) { + return values.list(); + } + + return childrenList + .stream() + .map(o -> (ASTNode) o) + .map(a -> visitChild(a)) + .collect(values.listWriter()); + } + public IValue getValue() { return this.ownValue; } @@ -259,24 +273,28 @@ protected void setKeywordParameters(String label, IList values) { protected IValue constructDeclarationNode(String constructor, IValue... children) { io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_DECLARATION_NODE_TYPE, constructor, args); + assert constr != null : "No constructor " + constructor + " for " + args; return values.constructor(constr, children); } protected IValue constructExpressionNode(String constructor, IValue... children) { io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_EXPRESSION_NODE_TYPE, constructor, args); + assert constr != null : "No constructor " + constructor + " for " + args; return values.constructor(constr, children); } protected IValue constructStatementNode(String constructor, IValue... children) { io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE, constructor, args); + assert constr != null : "No constructor " + constructor + " for " + args; return values.constructor(constr, children); } protected IValue constructTypeNode(String constructor, IValue... children) { io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_TYPE_NODE_TYPE, constructor, args); + assert constr != null : "No constructor " + constructor + " for " + args; return values.constructor(constr, children); } From dc16cba8ab41f32f0f42ef71dfb431ba63c5dece Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 12:16:14 +0200 Subject: [PATCH 055/134] fixing consequences of removing the NULL filters --- .../lang/java/m3/internal/ASTConverter.java | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 7fa04718619..ac06031e9c4 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -111,7 +111,7 @@ public void preVisit(ASTNode node) { // Still every such method must put the ownAnnotations list at the right place in their constructor. System.err.println("Now converting: " + getSourceLocation(node)); - + if (node instanceof IAnnotatable) { IAnnotatable annotable = (IAnnotatable) node; @@ -248,9 +248,16 @@ public boolean visit(ArrayInitializer node) { @Override public boolean visit(ArrayType node) { - IValue type = visitChild(node.getComponentType()); + int apiLevel = node.getAST().apiLevel(); - ownValue = constructTypeNode("arrayType", type); + if (AST.JLS2 <= apiLevel && apiLevel <= AST.JLS4) { + IValue type = visitChild(node.getComponentType()); + ownValue = constructTypeNode("arrayType", type); + } + else { + IValue type = visitChild(node.getElementType()); + ownValue = constructTypeNode("arrayType", type); + } return false; } @@ -805,10 +812,17 @@ public boolean visit(MethodDeclaration node) { } if (body != null) { - ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done(), body); + if ("constructor".equals(constructorName)) { + // constructors do not have return types or additional generic types + ownValue = constructDeclarationNode(constructorName, modifiers, name, parameters.done(), possibleExceptions.done(), body); + } + else { + ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done(), body); + } } else { assert !constructorName.equals("constructor"); // constructors must have a body + //| \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done()); } From b2d0701aaba69d2896f31f1ca79f5d0546d594af Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 12:20:12 +0200 Subject: [PATCH 056/134] IAnnotable does not appear to be a correctly functioning tag interface; have to replace by manual handling --- .../library/lang/java/m3/internal/ASTConverter.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index ac06031e9c4..308f93001c3 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1629,6 +1629,7 @@ public boolean visit(WhileStatement node) { @Override public boolean visit(WildcardType node) { String name = "wildcard"; + IList annos = visitChildren(node.annotations()); if (node.getBound() != null) { var bound = visitChild(node.getBound()); @@ -1637,12 +1638,12 @@ public boolean visit(WildcardType node) { } else { name = "super"; - } + } - ownValue = constructTypeNode(name, ownAnnotations, bound); + ownValue = constructTypeNode(name, annos, bound); } else { - ownValue = constructTypeNode(name, ownAnnotations); + ownValue = constructTypeNode(name, annos); } return false; From a500f793fe42b4f91b96e2a0fab9080d7c81cfae Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 12:22:04 +0200 Subject: [PATCH 057/134] anonymous classes do not have modifiers --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index e6ea744059b..a286c4474a9 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -93,7 +93,7 @@ data Declaration | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments, Declaration class) | \enumConstant(list[Modifier] modifiers, Expression name, list[Expression] arguments) | \class(list[Modifier] modifiers, Expression name, list[Declaration] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) - | \class(list[Modifier] modifiers, list[Declaration] body) + | \class(list[Declaration] body) | \interface(list[Modifier] modifiers, Expression name, list[Declaration] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \field(list[Modifier] modifiers, Type \type, list[Expression] fragments) | \initializer(list[Modifier] modifiers, Statement initializerBody) From e172a6c344ebf303192aba84313b34445f8d7c28 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 12:45:31 +0200 Subject: [PATCH 058/134] fixed alignment between JDT and M3 wrt lambda expressions --- .../rascalmpl/library/lang/java/m3/AST.rsc | 9 ++++---- .../lang/java/m3/internal/ASTConverter.java | 21 ++++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index a286c4474a9..47b477ca318 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -152,8 +152,9 @@ data Expression(TypeSymbol typ=\unresolved()) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) - | \variable(str identifier, list[Declaration] dimensionTypes) - | \variable(str identifier, list[Declaration] dimensionTypes, Expression \initializer) + | \lambdaParameter(Type \type, Expression variable) // for parenthesized lambdas + | \variable(Expression name, list[Declaration] dimensionTypes) + | \variable(Expression name, list[Declaration] dimensionTypes, Expression \initializer) | \bracket(Expression expression) | \this() | \this(Expression qualifier) @@ -171,8 +172,8 @@ data Expression(TypeSymbol typ=\unresolved()) | \normalAnnotation(Expression name, list[Expression] memberValuePairs) | \memberValuePair(Expression name, Expression \value) | \singleMemberAnnotation(str typeName, Expression \value) - | \lambda(list[Declaration] parameters, Statement block) - | \lambda(list[Declaration] parameters, Expression body) + | \lambda(list[Expression] parameters, Statement block) + | \lambda(list[Expression] parameters, Expression body) ; @synopsis{These are the Statement types of Java} diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 308f93001c3..880c7e6b509 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -845,7 +845,7 @@ public boolean visit(MethodInvocation node) { IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { - Expression e = (Expression) it.next(); + ASTNode e = (ASTNode) it.next(); arguments.append(visitChild(e)); } @@ -1103,9 +1103,20 @@ public boolean visit(YieldStatement node) { @Override public boolean visit(LambdaExpression node) { IListWriter parameters = values.listWriter(); - for (Iterator it = node.parameters().iterator(); it.hasNext();) { - SingleVariableDeclaration v = (SingleVariableDeclaration) it.next(); - parameters.append(visitChild(v)); + + if (!node.hasParentheses()) { + // without types for the parameters + for (Iterator it = node.parameters().iterator(); it.hasNext();) { + VariableDeclarationFragment v = (VariableDeclarationFragment) it.next(); + parameters.append(visitChild(v)); + } + } + else { + // with types for the parameters + for (Iterator it = node.parameters().iterator(); it.hasNext();) { + VariableDeclaration v = (VariableDeclaration) it.next(); + parameters.append(constructExpressionNode("lambdaParameter", visitChild(v))); + } } ownValue = constructExpressionNode("lambda", parameters.done(), visitChild(node.getBody())); @@ -1577,7 +1588,7 @@ public boolean visit(VariableDeclarationExpression node) { @Override public boolean visit(VariableDeclarationFragment node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IList dimensions = ((List) node.extraDimensions()) .stream() From 2b72bd2878bf21cdcc5ffb138343eec60e8d4e07 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 12:54:14 +0200 Subject: [PATCH 059/134] more alignment issues --- .../library/lang/java/m3/internal/ASTConverter.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 880c7e6b509..e805ac8e57b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -845,9 +845,11 @@ public boolean visit(MethodInvocation node) { IListWriter arguments = values.listWriter(); for (Iterator it = node.arguments().iterator(); it.hasNext();) { - ASTNode e = (ASTNode) it.next(); + Expression e = (Expression) it.next(); arguments.append(visitChild(e)); - } + // this sometimes procudes Type instead of Expression nodes? + } + if (node.getExpression() != null) { IValue expression = visitChild(node.getExpression()); From eccf89ac9a7cd5961b8c8f8eb27e4535ec42f516 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 14:14:50 +0200 Subject: [PATCH 060/134] added missing node for creation method references like String[]::new --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 1 + .../lang/java/m3/internal/ASTConverter.java | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 47b477ca318..49821dace26 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -168,6 +168,7 @@ data Expression(TypeSymbol typ=\unresolved()) | \markerAnnotation(Expression name) | \methodReference(Type \type, list[Type] typeArguments, Expression name) | \methodReference(Expression expression, list[Type] typeArguments, Expression name) + | \creationReference(Type \type, list[Type] typeArguments) | \superMethodReference(list[Type] typeArguments, Expression name) | \normalAnnotation(Expression name, list[Expression] memberValuePairs) | \memberValuePair(Expression name, Expression \value) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index e805ac8e57b..5999284e991 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -110,7 +110,7 @@ public void preVisit(ASTNode node) { // out the AST construction code of all of those visit methods. // Still every such method must put the ownAnnotations list at the right place in their constructor. - System.err.println("Now converting: " + getSourceLocation(node)); + System.err.println("Now converting: " + node.getClass().getCanonicalName() + "@ " + getSourceLocation(node)); if (node instanceof IAnnotatable) { IAnnotatable annotable = (IAnnotatable) node; @@ -212,6 +212,15 @@ public boolean visit(ArrayAccess node) { return false; } + @Override + public boolean visit(CreationReference node) { + IValue type = visitChild(node.getType()); + IValue typeArguments = visitChildren(node.typeArguments()); + + ownValue = constructExpressionNode("creationReference", type, typeArguments); + return false; + } + @Override public boolean visit(ArrayCreation node) { IValue type = visitChild(node.getType().getElementType()); @@ -848,6 +857,9 @@ public boolean visit(MethodInvocation node) { Expression e = (Expression) it.next(); arguments.append(visitChild(e)); // this sometimes procudes Type instead of Expression nodes? + if (!arguments.get(0).getType().getName().equals("Expression")) { + System.err.println(arguments.done()); + } } From 7f8b9b03d2a8063aabc9a9bcdc1e32a9139807cf Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 14:16:23 +0200 Subject: [PATCH 061/134] fixed name node for enums --- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 5999284e991..ac29ace66de 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -551,7 +551,7 @@ public boolean visit(EnumConstantDeclaration node) { @Override public boolean visit(EnumDeclaration node) { IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IListWriter implementedInterfaces = values.listWriter(); if (!node.superInterfaceTypes().isEmpty()) { From 7b409e1d72e2b34d2844737933260a713801b1b0 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 14:21:51 +0200 Subject: [PATCH 062/134] check for JLS12 for break expression support --- .../lang/java/m3/internal/ASTConverter.java | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index ac29ace66de..57c35d60118 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -329,7 +329,7 @@ public boolean visit(BreakStatement node) { IValue label = visitChild(node.getLabel()); ownValue = constructStatementNode("break", label); } - else if (node.getExpression() != null) { + else if (node.getAST().apiLevel() == AST.JLS12 && node.getExpression() != null) { IValue label = visitChild(node.getExpression()); ownValue = constructStatementNode("break", label); } @@ -1118,21 +1118,11 @@ public boolean visit(YieldStatement node) { public boolean visit(LambdaExpression node) { IListWriter parameters = values.listWriter(); - if (!node.hasParentheses()) { - // without types for the parameters - for (Iterator it = node.parameters().iterator(); it.hasNext();) { - VariableDeclarationFragment v = (VariableDeclarationFragment) it.next(); - parameters.append(visitChild(v)); - } - } - else { - // with types for the parameters - for (Iterator it = node.parameters().iterator(); it.hasNext();) { - VariableDeclaration v = (VariableDeclaration) it.next(); - parameters.append(constructExpressionNode("lambdaParameter", visitChild(v))); - } + for (Iterator it = node.parameters().iterator(); it.hasNext();) { + VariableDeclarationFragment v = (VariableDeclarationFragment) it.next(); + parameters.append(visitChild(v)); } - + ownValue = constructExpressionNode("lambda", parameters.done(), visitChild(node.getBody())); return false; } From ed5e3e030f15e67aa9a99c3cd3182009facf4df0 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 14:46:08 +0200 Subject: [PATCH 063/134] aligned annotation ASTs --- .../rascalmpl/library/lang/java/m3/AST.rsc | 9 +- .../lang/java/m3/internal/ASTConverter.java | 83 +++++-------------- .../m3/internal/JavaToRascalConverter.java | 6 +- 3 files changed, 26 insertions(+), 72 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 49821dace26..4eb8ab3c6a8 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -165,16 +165,13 @@ data Expression(TypeSymbol typ=\unresolved()) | \prefix(str operator, Expression operand) | \simpleName(str identifier) | \switch(Expression expression, list[Statement] cases) - | \markerAnnotation(Expression name) | \methodReference(Type \type, list[Type] typeArguments, Expression name) | \methodReference(Expression expression, list[Type] typeArguments, Expression name) | \creationReference(Type \type, list[Type] typeArguments) | \superMethodReference(list[Type] typeArguments, Expression name) - | \normalAnnotation(Expression name, list[Expression] memberValuePairs) - | \memberValuePair(Expression name, Expression \value) - | \singleMemberAnnotation(str typeName, Expression \value) | \lambda(list[Expression] parameters, Statement block) | \lambda(list[Expression] parameters, Expression body) + | \memberValuePair(Expression name, Expression \value) ; @synopsis{These are the Statement types of Java} @@ -254,11 +251,13 @@ data Modifier | \native() | \volatile() | \strictfp() - | \annotation(Expression \anno) | \onDemand() | \default() | \open() // for modules only | \transitive() // for module requirements only + | \markerAnnotation(Expression name) + | \normalAnnotation(Expression name, list[Expression] memberValuePairs) + | \singleMemberAnnotation(Expression typeName, Expression \value) ; @memo diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 57c35d60118..efb42f065eb 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -14,13 +14,10 @@ *******************************************************************************/ package org.rascalmpl.library.lang.java.m3.internal; -import java.util.Arrays; import java.util.Iterator; import java.util.List; import java.util.Map; -import org.eclipse.jdt.core.IAnnotatable; -import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.*; import io.usethesource.vallang.IList; @@ -28,6 +25,7 @@ import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; +import io.usethesource.vallang.type.TypeFactory; /** * This big visitor class has a case for every type of AST node in the JDT's core DOM model. @@ -106,58 +104,13 @@ else if (node instanceof ModuleDeclaration) { @Override public void preVisit(ASTNode node) { - // since many many nodes have annotatable possibilities, this factors - // out the AST construction code of all of those visit methods. - // Still every such method must put the ownAnnotations list at the right place in their constructor. - System.err.println("Now converting: " + node.getClass().getCanonicalName() + "@ " + getSourceLocation(node)); - - if (node instanceof IAnnotatable) { - IAnnotatable annotable = (IAnnotatable) node; - - try { - if (annotable.getAnnotations() == null) { - ownAnnotations = values.list(); - } - else { - ownAnnotations = Arrays.stream(annotable.getAnnotations()) - .map(o -> (ASTNode) o) - .map(a -> visitChild(a)) - .collect(values.listWriter()); - } - } - catch (JavaModelException e) { - // TODO: log this in a better way - System.err.println("Unhandled internal error: " + e.getMessage()); - } - } - else { - // This {sh,w}ould trigger downstream non-null assertions if someone tries - // to include annotations into a non-annotable syntax node. - // Otherwise this field should not be referenced until it is set here above again. - ownAnnotations = null; - } - - // many nodes also have modifiers - List modifiers = (List) node.getProperty("modifiers"); - if (modifiers != null) { - ownModifiers = modifiers.stream() - .map(o -> (ASTNode) o) - .map(a -> visitChild(a)) - .collect(values.listWriter()); - } - else { - // This {sh,w}ould trigger downstream non-null assertions if someone tries - // to include modifiers into a non-modifiable syntax node. - // Otherwise this field should not be referenced until it is set here above again. - ownModifiers = null; - } } @Override public boolean visit(AnnotationTypeDeclaration node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue name = visitChild(node.getName()); IListWriter bodyDeclarations = values.listWriter(); @@ -173,7 +126,7 @@ public boolean visit(AnnotationTypeDeclaration node) { @Override public boolean visit(AnnotationTypeMemberDeclaration node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue typeArgument = visitChild(node.getType()); IValue name = visitChild(node.getName()); @@ -526,7 +479,7 @@ public boolean visit(EnhancedForStatement node) { @Override public boolean visit(EnumConstantDeclaration node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue name = visitChild(node.getName()); IListWriter arguments = values.listWriter(); @@ -550,7 +503,7 @@ public boolean visit(EnumConstantDeclaration node) { @Override public boolean visit(EnumDeclaration node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue name = visitChild(node.getName()); IListWriter implementedInterfaces = values.listWriter(); @@ -600,7 +553,7 @@ public boolean visit(FieldAccess node) { @Override public boolean visit(FieldDeclaration node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue type = visitChild(node.getType()); IListWriter fragments = values.listWriter(); @@ -697,7 +650,7 @@ public boolean visit(InfixExpression node) { @Override public boolean visit(Initializer node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue body = visitChild(node.getBody()); ownValue = constructDeclarationNode("initializer", modifiers, body); @@ -738,7 +691,7 @@ public boolean visit(LineComment node) { @Override public boolean visit(MarkerAnnotation node) { IValue typeName = visitChild(node.getTypeName()); - ownValue = constructExpressionNode("markerAnnotation", typeName); + ownValue = constructModifierNode("markerAnnotation", typeName); return false; } @@ -750,7 +703,7 @@ public boolean visit(MemberRef node) { @Override public boolean visit(MemberValuePair node) { - IValue name = values.string(node.getName().getFullyQualifiedName()); + IValue name = visitChild(node.getName()); IValue value = visitChild(node.getValue()); ownValue = constructExpressionNode("memberValuePair", name, value); @@ -761,7 +714,7 @@ public boolean visit(MemberValuePair node) { @Override public boolean visit(MethodDeclaration node) { String constructorName = "method"; - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IListWriter genericTypes = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { @@ -826,6 +779,9 @@ public boolean visit(MethodDeclaration node) { ownValue = constructDeclarationNode(constructorName, modifiers, name, parameters.done(), possibleExceptions.done(), body); } else { + if (modifiers.getElementType() == TypeFactory.getInstance().nodeType()) { + System.err.println(modifiers); + } ownValue = constructDeclarationNode(constructorName, modifiers, genericTypes.done(), returnType, name, parameters.done(), possibleExceptions.done(), body); } } @@ -908,7 +864,7 @@ public boolean visit(NormalAnnotation node) { memberValuePairs.append(visitChild(p)); } - ownValue = constructExpressionNode("normalAnnotation", typeName, memberValuePairs.done()); + ownValue = constructModifierNode("normalAnnotation", typeName, memberValuePairs.done()); return false; } @@ -1046,7 +1002,7 @@ public boolean visit(SingleMemberAnnotation node) { IValue name = visitChild(node.getTypeName()); IValue value = visitChild(node.getValue()); - ownValue = constructExpressionNode("singleMemberAnnotation", name, value); + ownValue = constructModifierNode("singleMemberAnnotation", name, value); return false; } @@ -1054,7 +1010,7 @@ public boolean visit(SingleMemberAnnotation node) { @Override public boolean visit(SingleVariableDeclaration node) { IValue name = visitChild(node.getName()); - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue type = visitChild(node.getType()); IValue initializer = node.getInitializer() == null ? null : visitChild(node.getInitializer()); @@ -1083,7 +1039,8 @@ public boolean visit(SingleVariableDeclaration node) { @Override public boolean visit(Dimension node) { - ownValue = constructDeclarationNode("dimension", ownAnnotations); + var annos = visitChildren(node.annotations()); + ownValue = constructDeclarationNode("dimension", annos); return false; } @@ -1573,7 +1530,7 @@ public boolean visit(IntersectionType node) { @Override public boolean visit(VariableDeclarationExpression node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue type = visitChild(node.getType()); @@ -1614,7 +1571,7 @@ public boolean visit(VariableDeclarationFragment node) { @Override public boolean visit(VariableDeclarationStatement node) { - IList modifiers = mergeModifiersAndAnnotationsInOrderOfAppearance(ownModifiers, ownAnnotations); + IList modifiers = visitChildren(node.modifiers()); IValue type = visitChild(node.getType()); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 9037c38f19a..515f78f3172 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -15,7 +15,6 @@ package org.rascalmpl.library.lang.java.m3.internal; import java.net.URISyntaxException; -import java.util.Arrays; import java.util.List; import java.util.Map; import org.eclipse.jdt.core.compiler.IProblem; @@ -48,9 +47,7 @@ public abstract class JavaToRascalConverter extends ASTVisitor { protected final LimitedTypeStore typeStore; protected IValue ownValue; - protected IList ownAnnotations; - protected IList ownModifiers; - + private static final String DATATYPE_RASCAL_AST_TYPE_NODE = "Type"; private static final String DATATYPE_RASCAL_AST_MODIFIER_NODE = "Modifier"; private static final String DATATYPE_RASCAL_AST_DECLARATION_NODE = "Declaration"; @@ -249,6 +246,7 @@ public IValue getValue() { protected IConstructor constructModifierNode(String constructor, IValue... children) { io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE, constructor, args); + assert constr != null : "No constructor " + constructor + " for " + args; return values.constructor(constr, children); } From 1a2d1ee2daa977307be99831e6e8636ff9372d01 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 15:02:47 +0200 Subject: [PATCH 064/134] fixed lambda with typed parameters and aligned lambda structure better with AST definition --- .../rascalmpl/library/lang/java/m3/AST.rsc | 13 +++++----- .../lang/java/m3/internal/ASTConverter.java | 26 ++++++++++++++----- 2 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 4eb8ab3c6a8..5f6dcf8c50f 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -95,14 +95,16 @@ data Declaration | \class(list[Modifier] modifiers, Expression name, list[Declaration] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) | \class(list[Declaration] body) | \interface(list[Modifier] modifiers, Expression name, list[Declaration] typeParameters, list[Type] extends, list[Type] implements, list[Declaration] body) - | \field(list[Modifier] modifiers, Type \type, list[Expression] fragments) + | \field(list[Modifier] modifiers, Type \type, list[Declaration] fragments) | \initializer(list[Modifier] modifiers, Statement initializerBody) | \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) | \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) | \constructor(list[Modifier] modifiers, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) | \import(Expression name) | \package(list[Modifier] modifiers, Expression name) - | \variables(list[Modifier] modifiers, Type \type, list[Expression] \fragments) + | \variables(list[Modifier] modifiers, Type \type, list[Declaration] \fragments) + | \variable(Expression name, list[Declaration] dimensionTypes) + | \variable(Expression name, list[Declaration] dimensionTypes, Expression \initializer) | \typeParameter(Expression name, list[Type] extendsList) // TODO: this seems unused at the moment, relation to wildcard, super/extends unknown | \annotationType(list[Modifier] modifiers, Expression name, list[Declaration] body) | \annotationTypeMember(list[Modifier] modifiers, Type \type, Expression name) @@ -152,9 +154,6 @@ data Expression(TypeSymbol typ=\unresolved()) | \stringLiteral(str stringValue, str literal=stringValue) | \textBlock(str stringValue, str literal=stringValue) | \type(Type \type) - | \lambdaParameter(Type \type, Expression variable) // for parenthesized lambdas - | \variable(Expression name, list[Declaration] dimensionTypes) - | \variable(Expression name, list[Declaration] dimensionTypes, Expression \initializer) | \bracket(Expression expression) | \this() | \this(Expression qualifier) @@ -169,8 +168,8 @@ data Expression(TypeSymbol typ=\unresolved()) | \methodReference(Expression expression, list[Type] typeArguments, Expression name) | \creationReference(Type \type, list[Type] typeArguments) | \superMethodReference(list[Type] typeArguments, Expression name) - | \lambda(list[Expression] parameters, Statement block) - | \lambda(list[Expression] parameters, Expression body) + | \lambda(list[Declaration] parameters, Statement block) + | \lambda(list[Declaration] parameters, Expression body) | \memberValuePair(Expression name, Expression \value) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index efb42f065eb..4082ef24ba0 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -40,7 +40,9 @@ * specific, and all node src locations point to exactly the the right input subsentences. */ public class ASTConverter extends JavaToRascalConverter { - + // prints a clickable trace while converting for easier diagnostics + private final boolean debug = true; + public ASTConverter(final LimitedTypeStore typeStore, Map cache, boolean collectBindings) { super(typeStore, cache, collectBindings); } @@ -104,7 +106,9 @@ else if (node instanceof ModuleDeclaration) { @Override public void preVisit(ASTNode node) { - System.err.println("Now converting: " + node.getClass().getCanonicalName() + "@ " + getSourceLocation(node)); + if (debug) { + System.err.println("Now converting: " + node.getClass().getCanonicalName() + "@ " + getSourceLocation(node)); + } } @@ -1074,10 +1078,20 @@ public boolean visit(YieldStatement node) { @Override public boolean visit(LambdaExpression node) { IListWriter parameters = values.listWriter(); + boolean noTypes = true; for (Iterator it = node.parameters().iterator(); it.hasNext();) { - VariableDeclarationFragment v = (VariableDeclarationFragment) it.next(); - parameters.append(visitChild(v)); + ASTNode next = (ASTNode) it.next(); + if (next instanceof VariableDeclarationFragment) { + // no types + VariableDeclarationFragment v = (VariableDeclarationFragment) next; + parameters.append(visitChild(v)); + } + else { + // with type + noTypes = false; + parameters.append(visitChild(next)); + } } ownValue = constructExpressionNode("lambda", parameters.done(), visitChild(node.getBody())); @@ -1559,10 +1573,10 @@ public boolean visit(VariableDeclarationFragment node) { if (node.getInitializer() != null) { IValue initializer = visitChild(node.getInitializer()); - ownValue = constructExpressionNode("variable", name, dimensions, initializer); + ownValue = constructDeclarationNode("variable", name, dimensions, initializer); } else { - ownValue = constructExpressionNode("variable", name, dimensions); + ownValue = constructDeclarationNode("variable", name, dimensions); } From 4870bb64f735f986b468f6cf798f6d81db1a1b0b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 15:50:39 +0200 Subject: [PATCH 065/134] identifiers are now called id instead of simpleName for r3eadability of printed trees, also qualifiednames were flattened to lists instead of weirdly nested names --- .../rascalmpl/library/lang/java/m3/AST.rsc | 4 ++-- .../lang/java/m3/internal/ASTConverter.java | 22 ++++++++++++++----- .../java/m3/internal/EclipseJavaCompiler.java | 16 ++++++++++---- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 5f6dcf8c50f..a9e7ae48bf2 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -138,7 +138,7 @@ data Expression(TypeSymbol typ=\unresolved()) | \newObject(Expression expr, Type \type, list[Declaration] typeParameters, list[Expression] args) | \newObject(Type \type, list[Declaration] typeParameters, list[Expression] args, Declaration class) | \newObject(Type \type, list[Declaration] typeParameters, list[Expression] args) - | \qualifiedName(Expression qualifier, Expression expression) + | \qualifiedName(list[Expression] identifiers) | \conditional(Expression expression, Expression thenBranch, Expression elseBranch) | \fieldAccess(Expression name) | \fieldAccess(Expression qualifier, Expression name) @@ -162,7 +162,7 @@ data Expression(TypeSymbol typ=\unresolved()) | \infix(Expression lhs, str operator, Expression rhs) | \postfix(Expression operand, str operator) | \prefix(str operator, Expression operand) - | \simpleName(str identifier) + | \id(str identifier) | \switch(Expression expression, list[Statement] cases) | \methodReference(Type \type, list[Type] typeArguments, Expression name) | \methodReference(Expression expression, list[Type] typeArguments, Expression name) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 4082ef24ba0..ec5162a00ed 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -20,6 +20,7 @@ import org.eclipse.jdt.core.dom.*; +import io.usethesource.vallang.IConstructor; import io.usethesource.vallang.IList; import io.usethesource.vallang.IListWriter; import io.usethesource.vallang.ISourceLocation; @@ -41,7 +42,7 @@ */ public class ASTConverter extends JavaToRascalConverter { // prints a clickable trace while converting for easier diagnostics - private final boolean debug = true; + private final boolean debug = false; public ASTConverter(final LimitedTypeStore typeStore, Map cache, boolean collectBindings) { super(typeStore, cache, collectBindings); @@ -59,7 +60,7 @@ public void postVisit(ASTNode node) { if (!decl.getScheme().equals("unknown")) { setKeywordParameter("decl", decl); } - if (getAdtType() != DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE) { + if (getAdtType() != DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE && !decl.getScheme().equals("java+package")) { IValue type = resolveType(node); setKeywordParameter("typ", type); @@ -951,11 +952,20 @@ public boolean visit(PrimitiveType node) { @Override public boolean visit(QualifiedName node) { - IValue qualifier = visitChild(node.getQualifier()); - + IConstructor qualifier = (IConstructor) visitChild(node.getQualifier()); IValue name = visitChild(node.getName()); - ownValue = constructExpressionNode("qualifiedName", qualifier, name); + IListWriter names = values.listWriter(); + if (qualifier.getConstructorType().getName().equals("qualifiedName")) { + // flatten + names.appendAll((IList) qualifier.get("identifiers")); + } + else { + names.append(qualifier); + } + names.append(name); + + ownValue = constructExpressionNode("qualifiedName", names.done()); return false; } @@ -988,7 +998,7 @@ public boolean visit(ReturnStatement node) { public boolean visit(SimpleName node) { IValue value = values.string(node.getFullyQualifiedName()); - ownValue = constructExpressionNode("simpleName", value); + ownValue = constructExpressionNode("id", value); return false; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index feff2b56dae..caf13f2c47e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -229,11 +229,19 @@ public void acceptAST(String sourceFilePath, CompilationUnit ast) { }, null); } else { - for (IValue file: files) { - ISourceLocation loc = (ISourceLocation) file; - CompilationUnit cu = getCompilationUnit(loc.getPath(), getFileContents(loc), resolveBindings, errorRecovery, javaVersion, translatePaths(sourcePath), translatePaths(classPath)); - buildNotifier.accept(loc, cu); + monitor.jobStart("Mapping syntax trees", files.size()); + try { + for (IValue file: files) { + monitor.jobStep("Mapping syntax trees", file.toString(), 1); + ISourceLocation loc = (ISourceLocation) file; + CompilationUnit cu = getCompilationUnit(loc.getPath(), getFileContents(loc), resolveBindings, errorRecovery, javaVersion, translatePaths(sourcePath), translatePaths(classPath)); + buildNotifier.accept(loc, cu); + } + } + finally { + monitor.jobEnd("Mapping syntax trees", true); } + } } From f018cd1473ea1aa5092598883137794f7d4854be Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 16:05:48 +0200 Subject: [PATCH 066/134] fixed problems with NPEs and lambdas --- .../library/lang/java/m3/internal/ASTConverter.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index ec5162a00ed..1613c14aace 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -88,19 +88,24 @@ else if (node instanceof MethodDeclaration) { } else if (node instanceof VariableDeclaration) { IVariableBinding binding = ((VariableDeclaration) node).resolveBinding(); - return bindingsResolver.resolveType(binding.getType(), false); + if (binding != null && binding.getType() != null) { // some variables have inferred types + return bindingsResolver.resolveType(binding.getType(), false); + } } + else if (node instanceof ModuleDeclaration) { IModuleBinding binding = ((ModuleDeclaration) node).resolveBinding(); return bindingsResolver.resolveType(binding, true); } } catch (NullPointerException e) { - // TODO: log this in a better way - System.err.println("Got NPE for node " + node + ((e.getStackTrace().length > 0) ? ("\n\t" + e.getStackTrace()[0]) : "")); + e.printStackTrace(); + // This happens sometime with type incorrect Java programs, but can also be due to an error in the mapping code. + assert false : "Resolving type for " + node.getClass().getCanonicalName() + " @ " + getSourceLocation(node); + } - // some nodes do not have a type + // some nodes do not have a type, or type resolution has failed and then we simply do not store the type in the tree. return null; } From 5039cc9e1184349f4b5b1126111b7479c10113a3 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 17:19:54 +0200 Subject: [PATCH 067/134] added progress bar for AST construction of many files --- .../java/m3/internal/EclipseJavaCompiler.java | 57 ++++++++++++------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index caf13f2c47e..d803acf3143 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -53,7 +53,7 @@ public class EclipseJavaCompiler { protected final IValueFactory VF; protected final LimitedTypeStore definitions; - private IRascalMonitor monitor; + private final IRascalMonitor monitor; public EclipseJavaCompiler(IValueFactory vf, TypeStore definitions, IRascalMonitor monitor) { this.VF = vf; @@ -196,37 +196,55 @@ protected IValue convertToM3(LimitedTypeStore store, Map buildNotifier) throws IOException { boolean fastPath = true; + for (IValue f : files) { fastPath &= safeResolve((ISourceLocation)f).getScheme().equals("file"); } if (fastPath) { + monitor.jobStart("Mapping syntax trees", files.size()); + Map reversePathLookup = new HashMap<>(); String[] absolutePaths = new String[files.size()]; String[] encodings = new String[absolutePaths.length]; int i = 0; - for (IValue p : files) { - ISourceLocation loc = (ISourceLocation)p; - if (!URIResolverRegistry.getInstance().isFile(loc)) { - throw RuntimeExceptionFactory.io(VF.string("" + loc + " is not a file"), null, null); - } - if (!URIResolverRegistry.getInstance().exists(loc)) { - throw RuntimeExceptionFactory.io(VF.string("" + loc + " doesn't exist"), null, null); - } + try { + monitor.jobStart("Resolving source files", files.size()); + + for (IValue p : files) { + monitor.jobStep("Resolving source files", p.toString(), 1); + ISourceLocation loc = (ISourceLocation)p; + if (!URIResolverRegistry.getInstance().isFile(loc)) { + throw RuntimeExceptionFactory.io(VF.string("" + loc + " is not a file"), null, null); + } + if (!URIResolverRegistry.getInstance().exists(loc)) { + throw RuntimeExceptionFactory.io(VF.string("" + loc + " doesn't exist"), null, null); + } - absolutePaths[i] = new File(safeResolve(loc).getPath()).getAbsolutePath(); - reversePathLookup.put(absolutePaths[i], loc); - encodings[i] = guessEncoding(loc); - i++; + absolutePaths[i] = new File(safeResolve(loc).getPath()).getAbsolutePath(); + reversePathLookup.put(absolutePaths[i], loc); + encodings[i] = guessEncoding(loc); + i++; + } + } + finally { + monitor.jobEnd("Resolving source files", true); } ASTParser parser = constructASTParser(resolveBindings, errorRecovery, javaVersion, translatePaths(sourcePath), translatePaths(classPath)); - parser.createASTs(absolutePaths, encodings, new String[0], new FileASTRequestor() { - @Override - public void acceptAST(String sourceFilePath, CompilationUnit ast) { - buildNotifier.accept(reversePathLookup.get(sourceFilePath), ast); - } - }, null); + try { + monitor.jobStart("Mapping syntax trees", files.size()); + parser.createASTs(absolutePaths, encodings, new String[0], new FileASTRequestor() { + @Override + public void acceptAST(String sourceFilePath, CompilationUnit ast) { + monitor.jobStep("Mapping syntax trees", sourceFilePath, 1); + buildNotifier.accept(reversePathLookup.get(sourceFilePath), ast); + } + }, null); + } + finally { + monitor.jobEnd("Mapping syntax trees", true); + } } else { monitor.jobStart("Mapping syntax trees", files.size()); @@ -241,7 +259,6 @@ public void acceptAST(String sourceFilePath, CompilationUnit ast) { finally { monitor.jobEnd("Mapping syntax trees", true); } - } } From f696b23eaf28900f426f17e125087a35b25b6b70 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 17:44:10 +0200 Subject: [PATCH 068/134] replaced generic infix expression by the actual binary operator constructors, as it should be --- .../rascalmpl/library/lang/java/m3/AST.rsc | 20 +++++- .../lang/java/m3/internal/ASTConverter.java | 69 +++++++++++++++++-- 2 files changed, 81 insertions(+), 8 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index a9e7ae48bf2..2058a7c9af1 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -159,7 +159,25 @@ data Expression(TypeSymbol typ=\unresolved()) | \this(Expression qualifier) | \super() | \declarationExpression(Declaration declaration) - | \infix(Expression lhs, str operator, Expression rhs) + | \times(Expression lhs, Expression rhs) + | \divide(Expression lhs, Expression rhs) + | \remainder(Expression lhs, Expression rhs) + | \plus(Expression lhs, Expression rhs) + | \minus(Expression lhs, Expression rhs) + | \leftShift(Expression lhs, Expression rhs) + | \rightShift(Expression lhs, Expression rhs) + | \rightShiftSigned(Expression lhs, Expression rhs) + | \less(Expression lhs, Expression rhs) + | \greater(Expression lhs, Expression rhs) + | \lessEquals(Expression lhs, Expression rhs) + | \greaterEquals(Expression lhs, Expression rhs) + | \equals(Expression lhs, Expression rhs) + | \notEquals(Expression lhs, Expression rhs) + | \xor(Expression lhs, Expression rhs) + | \or(Expression lhs, Expression rhs) + | \and(Expression lhs, Expression rhs) + | \conditionalOr(Expression lhs, Expression rhs) + | \conditionalAnd(Expression lhs, Expression rhs) | \postfix(Expression operand, str operator) | \prefix(str operator, Expression operand) | \id(str identifier) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 1613c14aace..186b3e2bb64 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -19,6 +19,7 @@ import java.util.Map; import org.eclipse.jdt.core.dom.*; +import org.eclipse.jdt.core.dom.InfixExpression.Operator; import io.usethesource.vallang.IConstructor; import io.usethesource.vallang.IList; @@ -643,18 +644,72 @@ public boolean visit(ImportDeclaration node) { @Override public boolean visit(InfixExpression node) { - IValue operator = values.string(node.getOperator().toString()); + Operator op = node.getOperator(); IValue leftSide = visitChild(node.getLeftOperand()); IValue rightSide = visitChild(node.getRightOperand()); - IValue intermediateExpression = constructExpressionNode("infix", leftSide, operator, rightSide); - for (Iterator it = node.extendedOperands().iterator(); it.hasNext();) { - Expression e = (Expression) it.next(); - intermediateExpression = constructExpressionNode("infix", intermediateExpression, operator, visitChild(e)); + switch (op.toString()) { + case "*": + ownValue = constructExpressionNode("times", leftSide, rightSide); + break; + case "/": + ownValue = constructExpressionNode("divide", leftSide, rightSide); + break; + case "%": + ownValue = constructExpressionNode("remainder", leftSide, rightSide); + break; + case "+": + ownValue = constructExpressionNode("plus", leftSide, rightSide); + break; + case "-": + ownValue = constructExpressionNode("minus", leftSide, rightSide); + break; + case "<<": + ownValue = constructExpressionNode("leftShift", leftSide, rightSide); + break; + case ">>": + ownValue = constructExpressionNode("rightShift", leftSide, rightSide); + break; + case ">>>": + ownValue = constructExpressionNode("rightShiftSigned", leftSide, rightSide); + break; + case "<": + ownValue = constructExpressionNode("less", leftSide, rightSide); + break; + case ">": + ownValue = constructExpressionNode("greater", leftSide, rightSide); + break; + case "<=": + ownValue = constructExpressionNode("lessEquals", leftSide, rightSide); + break; + case ">=": + ownValue = constructExpressionNode("greaterEquals", leftSide, rightSide); + break; + case "==": + ownValue = constructExpressionNode("equals", leftSide, rightSide); + break; + case "!=": + ownValue = constructExpressionNode("notEquals", leftSide, rightSide); + break; + case "^": + ownValue = constructExpressionNode("xor", leftSide, rightSide); + break; + case "|": + ownValue = constructExpressionNode("or", leftSide, rightSide); + break; + case "&": + ownValue = constructExpressionNode("and", leftSide, rightSide); + break; + case "||": + ownValue = constructExpressionNode("conditionalOr", leftSide, rightSide); + break; + case "&&": + ownValue = constructExpressionNode("conditionalAnd", leftSide, rightSide); + break; + default: + throw new IllegalArgumentException(node.getOperator().getClass().getCanonicalName()); } - ownValue = intermediateExpression; - return false; } From 70b227ac08f89aebf3b2917b3972ed00961500c7 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Wed, 24 Apr 2024 21:25:39 +0200 Subject: [PATCH 069/134] prefix and postfix expressions are now modeled again as unitary constructors with a constructor per operator, like the binary expressions --- .../rascalmpl/library/lang/java/m3/AST.rsc | 10 +++- .../lang/java/m3/internal/ASTConverter.java | 60 ++++++++++++------- 2 files changed, 45 insertions(+), 25 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 2058a7c9af1..b28c1b4fc3a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -178,8 +178,14 @@ data Expression(TypeSymbol typ=\unresolved()) | \and(Expression lhs, Expression rhs) | \conditionalOr(Expression lhs, Expression rhs) | \conditionalAnd(Expression lhs, Expression rhs) - | \postfix(Expression operand, str operator) - | \prefix(str operator, Expression operand) + | \postIncrement(Expression operand) + | \postDecrement(Expression operand) + | \preIncrement(Expression operand) + | \preDecrement(Expression operand) + | \prePlus(Expression operand) + | \preMinus(Expression operand) + | \preComplement(Expression operand) + | \preNot(Expression operand) | \id(str identifier) | \switch(Expression expression, list[Statement] cases) | \methodReference(Type \type, list[Type] typeArguments, Expression name) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 186b3e2bb64..e2be8a20618 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -985,10 +985,19 @@ public boolean visit(ParenthesizedExpression node) { @Override public boolean visit(PostfixExpression node) { + org.eclipse.jdt.core.dom.PostfixExpression.Operator op = node.getOperator(); IValue operand = visitChild(node.getOperand()); - IValue operator = values.string(node.getOperator().toString()); - - ownValue = constructExpressionNode("postfix", operand, operator); + + switch (op.toString()) { + case "++": + ownValue = constructExpressionNode("postIncrement", operand); + break; + case "--": + ownValue = constructExpressionNode("postDecrement", operand); + break; + default: + throw new IllegalArgumentException(op.toString()); + } return false; } @@ -996,9 +1005,30 @@ public boolean visit(PostfixExpression node) { @Override public boolean visit(PrefixExpression node) { IValue operand = visitChild(node.getOperand()); - IValue operator = values.string(node.getOperator().toString()); + org.eclipse.jdt.core.dom.PrefixExpression.Operator operator = node.getOperator(); - ownValue = constructExpressionNode("prefix", operator, operand); + switch (operator.toString()) { + case "++": + ownValue = constructExpressionNode("preIncrement", operand); + break; + case "--": + ownValue = constructExpressionNode("preDecrement", operand); + break; + case "+": + ownValue = constructExpressionNode("prePlus", operand); + break; + case "-": + ownValue = constructExpressionNode("preMinus", operand); + break; + case "~": + ownValue = constructExpressionNode("preComplement", operand); + break; + case "!": + ownValue = constructExpressionNode("preNot", operand); + break; + default: + throw new IllegalArgumentException(operator.toString()); + } return false; } @@ -1144,27 +1174,11 @@ public boolean visit(YieldStatement node) { return false; } - @Override public boolean visit(LambdaExpression node) { - IListWriter parameters = values.listWriter(); - boolean noTypes = true; - - for (Iterator it = node.parameters().iterator(); it.hasNext();) { - ASTNode next = (ASTNode) it.next(); - if (next instanceof VariableDeclarationFragment) { - // no types - VariableDeclarationFragment v = (VariableDeclarationFragment) next; - parameters.append(visitChild(v)); - } - else { - // with type - noTypes = false; - parameters.append(visitChild(next)); - } - } + IList parameters = visitChildren(node.parameters()); - ownValue = constructExpressionNode("lambda", parameters.done(), visitChild(node.getBody())); + ownValue = constructExpressionNode("lambda", parameters, visitChild(node.getBody())); return false; } From e9571967868355c68068e9c2d8e90e2be410b8f8 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 11:32:22 +0200 Subject: [PATCH 070/134] Type ASTs now also get a TypeSymbol typ parameter for easy reference --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 15 ++++++++++++++- .../lang/java/m3/internal/ASTConverter.java | 7 +++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index b28c1b4fc3a..293de98423f 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -235,7 +235,20 @@ data Statement ; @synopsis{These are the literal types you can find in Java programs.} -data Type +@description{ +* The constructors of Type represent the syntax of types in Java. +* Their `typ` keyword field maps the syntax to the symbolic type representation as ((TypeSymbol))s. +} +@pitfalls{ +* ((Type)) and ((TypeSymbol)) are easy to confuse because they are very similar in name, structure and intent. It is good to remember +that there can be more TypeSymbols while analyzing types for Java than one can type in. Namely, ((TypeSymbol)) is used to +compute with and analyze the Java type system, while ((Type)) is only meant to represent the syntax of types in Java source code. +* ((Type)) closely follows the syntactic structure, while ((TypeSymbol)) follows the logical structure. +For example: `Node[]` in Java syntax becomes `arrayType(parameterizedType(simpleType(id("Node")),[simpleType(id("Cons"))]))` as +an abstract syntax tree ((Type)), which becomes this ((TypeSymbol)): `array(class(|class:///Node|,[interface(|interface:///Cons|,[])]),1))` +* ((TypeSymbol)) reduces different ways of writing types to one core canonical +} +data Type(TypeSymbol typ=unresolved()) = arrayType(Type \type) | parameterizedType(Type \type, list[Type] typeArguments) | qualifiedType(Type qualifier, Expression simpleName) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index e2be8a20618..51caed9df2c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -51,7 +51,7 @@ public ASTConverter(final LimitedTypeStore typeStore, Map Date: Thu, 25 Apr 2024 15:39:40 +0200 Subject: [PATCH 071/134] all AST nodes now have a .src field --- .../library/lang/java/m3/internal/ASTConverter.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 51caed9df2c..172b70d82a5 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -51,9 +51,6 @@ public ASTConverter(final LimitedTypeStore typeStore, Map Date: Thu, 25 Apr 2024 16:40:13 +0200 Subject: [PATCH 072/134] improved the AST spec for speed and diagnostics purposes --- src/org/rascalmpl/library/analysis/m3/AST.rsc | 67 +++++++++++++++---- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/AST.rsc b/src/org/rascalmpl/library/analysis/m3/AST.rsc index b8eab247d3e..497f4ef86f9 100644 --- a/src/org/rascalmpl/library/analysis/m3/AST.rsc +++ b/src/org/rascalmpl/library/analysis/m3/AST.rsc @@ -28,6 +28,7 @@ module analysis::m3::AST import Message; import Node; +import IO; import analysis::m3::TypeSymbol; @synopsis{For metric purposes we can use a true AST declaration tree, a simple list of lines for generic metrics, or the reason why we do not have an AST.} @@ -111,6 +112,8 @@ data Modifier( loc src = |unknown:///| ); +data Bound; + @synopsis{Test for the consistency characteristics of an M3 annotated abstract syntax tree} bool astNodeSpecification(node n, str language = "java", bool checkNameResolution=false, bool checkSourceLocation=true) { // get a loc from any node if there is any. @@ -122,20 +125,60 @@ bool astNodeSpecification(node n, str language = "java", bool checkNameResolutio int end(loc l) = l.offset + l.length; bool leftToRight(loc l, loc r) = end(l) <= begin(r); bool leftToRight(node a, node b) = leftToRight(pos(a), pos(b)); + bool included(node parent, node child) = begin(parent) <= begin(child) && end(child) <= end(parent); if (checkSourceLocation) { - // all nodes have src annotations - assert all(/node x := n, x.src?); - - // siblings are sorted in the input, even if some of them are lists - assert all(/node x := n, [*_, node a, node b, *_] := getChildren(x), leftToRight(a,b)); - assert all(/node x := n, [*_, node a, [node b, *_], *_] := getChildren(x), leftToRight(a,b)); - assert all(/node x := n, [*_, [*_, node a], node b, *_] := getChildren(x), leftToRight(a,b)); - assert all(/node x := n, [*_, [*_, node a], [node b, *_], *_] := getChildren(x), leftToRight(a,b)); - assert all(/[*_, node a, node b, *_] := n, leftToRight(a,b)); - - // children positions are included in the parent input scope - assert all(/node parent := n, /node child := parent, begin(parent) <= begin(child), end(child) <= end(parent)); + // all AST nodes have src annotations + for (/node x := n, TypeSymbol _ !:= x, Message _ !:= x, Bound _ !:= x) { + if (!(x.src?)) { + println("No .src annotation on: + ' "); + return false; + } + + // Note that by removing all the (unannotated) empty lists here, we cover many more complex situations + // below in detecting adjacent nodes in syntax trees. + children = [ e | e <- getChildren(x), e != []]; + + // Here we collect all the possible ways nodes can be direct siblings in an abstract syntax tree: + siblings = [ + *[ | [*_, node a, node b, *_] := children], // adjacent nodes + *[ | [*_, node a, [node b, *_], *_] := children], // node followed by non-empty list + *[ | [*_, [*_, node a], node b, *_] := children], // non-empty list followed by node + *[ | [*_, [*_, node a], [node b, *_], *_] := children], // adjacent non-empty lists + *[ | [*_, [*_, node a, node b, *_], *_] := children] // nodes inside a list (elements can not be lists again) + ]; + + // Note that by induction: if all the pairwise adjacent siblings are in-order, then all siblings are in order + + // siblings are sorted in the input, even if some of them are lists + for ( <- siblings) { + if (!leftToRight(a, b)) { + println("Siblings are out of order: + 'a : is + 'b : is "); + return false; + } + if (ab <- [a,b], !included(n, ab)) { + println("Child location not is not covered by the parent location: + ' parent: + ' child : , is "); + return false; + } + } + + // if ([*_, [*_, [*_], *_], *_] := getChildren(x)) { + // println("Node contains a directly nested list: + // ' : "); + // return false; + // } + + // if ([_, *_, str _, *_] := children || [*_, str _, *_, _] := children) { + // println("Literals and identifiers must be singletons: + // ' "); + // return false; + // } + } } if (checkNameResolution) { From eb21c38f590c9528b7f9d8b5107bba4b0988d9ff Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 16:41:04 +0200 Subject: [PATCH 073/134] fixed bug in import statement AST, where accidentally and AST node shape for on-demand .* imports was confused with being a modifier --- src/org/rascalmpl/library/lang/java/m3/AST.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 293de98423f..443f41ac92d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -100,7 +100,8 @@ data Declaration | \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) | \method(list[Modifier] modifiers, list[Declaration] typeParameters, Type \return, Expression name, list[Declaration] parameters, list[Expression] exceptions) | \constructor(list[Modifier] modifiers, Expression name, list[Declaration] parameters, list[Expression] exceptions, Statement impl) - | \import(Expression name) + | \import(list[Modifier] modifiers, Expression name) + | \importOnDemand(list[Modifier] modifiers, Expression name) | \package(list[Modifier] modifiers, Expression name) | \variables(list[Modifier] modifiers, Type \type, list[Declaration] \fragments) | \variable(Expression name, list[Declaration] dimensionTypes) @@ -287,7 +288,6 @@ data Modifier | \native() | \volatile() | \strictfp() - | \onDemand() | \default() | \open() // for modules only | \transitive() // for module requirements only From ff553c0a9160c6fb4dc285a8bef823fa726112b5 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 16:41:15 +0200 Subject: [PATCH 074/134] forgot to add --- .../lang/java/m3/internal/ASTConverter.java | 27 ++++++++++++++----- .../m3/internal/JavaToRascalConverter.java | 5 ++++ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 172b70d82a5..8d7f0ef3399 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -629,15 +629,28 @@ public boolean visit(ImportDeclaration node) { IListWriter importModifiers = values.listWriter(); if (node.getAST().apiLevel() >= AST.JLS3) { - if (node.isStatic()) - importModifiers.append(constructModifierNode("static")); - - if (node.isOnDemand()) - importModifiers.append(constructModifierNode("onDemand")); + if (node.isStatic()) { + var entireNode = getSourceLocation(node); + var namePosition = getSourceLocation(node.getName()); + // we assume the following positioning: + // import static class + // ^^^^^^^^ + // position of the static keyword can be anything between the import keyword and the imported class or method. + int staticStart = entireNode.getOffset() + "import".length(); + var staticPos = values.sourceLocation(entireNode.top(), + staticStart, + namePosition.getOffset() - staticStart); + + importModifiers.append(constructModifierNode(staticPos, "static")); +} } - ownValue = constructDeclarationNode("import", name); - setKeywordParameters("modifiers", importModifiers.done()); + if (node.isOnDemand()) { + ownValue = constructDeclarationNode("import", importModifiers.done(), name); + } + else { + ownValue = constructDeclarationNode("importOnDemand", importModifiers.done(), name); + } return false; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 515f78f3172..ebabf5cfb62 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -243,6 +243,11 @@ public IValue getValue() { return this.ownValue; } + protected IConstructor constructModifierNode(ISourceLocation src, String constructor, IValue... children) { + return constructModifierNode(constructor, children) + .asWithKeywordParameters().setParameter("src", src); + } + protected IConstructor constructModifierNode(String constructor, IValue... children) { io.usethesource.vallang.type.Type args = TF.tupleType(children); io.usethesource.vallang.type.Type constr = typeStore.lookupConstructor(DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE, constructor, args); From aea438f6f6b324002ac9f3a87a20ad48d41ecf57 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 16:57:16 +0200 Subject: [PATCH 075/134] added convenience utility for checking large numbers of ASTs instances against the specification, with progress monitor --- src/org/rascalmpl/library/analysis/m3/AST.rsc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/org/rascalmpl/library/analysis/m3/AST.rsc b/src/org/rascalmpl/library/analysis/m3/AST.rsc index 497f4ef86f9..a0ba1013ef0 100644 --- a/src/org/rascalmpl/library/analysis/m3/AST.rsc +++ b/src/org/rascalmpl/library/analysis/m3/AST.rsc @@ -29,6 +29,8 @@ module analysis::m3::AST import Message; import Node; import IO; +import Set; +import util::Monitor; import analysis::m3::TypeSymbol; @synopsis{For metric purposes we can use a true AST declaration tree, a simple list of lines for generic metrics, or the reason why we do not have an AST.} @@ -194,6 +196,18 @@ bool astNodeSpecification(node n, str language = "java", bool checkNameResolutio return true; } +@synopsis{Check the AST node specification on a (large) set of ASTs and monitor the progress.} +bool astNodeSpecification(set[node] toCheck, str language = "java", bool checkNameResolution=false, bool checkSourceLocation=true) + = job("AST specification checker", (void (str, int) step) { + for (node ast <- toCheck) { + step(loc l := ast.src ? l.path : "AST without src location", 1); + if (!astNodeSpecification(ast, language=language, checkNameResolution=checkNameResolution, checkSourceLocation=checkSourceLocation)) { + return false; + } + } + + return true; + }, totalWork=size(toCheck)); From 6bf6be7221c8584ce92cae2bbc01a484c567c967 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 16:57:54 +0200 Subject: [PATCH 076/134] job functions can now return the value their block returns, for convenience sake. Void is also ok so this is (source) backward compatible --- src/org/rascalmpl/library/util/Monitor.rsc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/org/rascalmpl/library/util/Monitor.rsc b/src/org/rascalmpl/library/util/Monitor.rsc index 3d46000e073..9f9ef444fa8 100644 --- a/src/org/rascalmpl/library/util/Monitor.rsc +++ b/src/org/rascalmpl/library/util/Monitor.rsc @@ -71,10 +71,10 @@ with a parameterized workload and the same label as the job name. @pitfalls{ * additional work with ((jobTodo)) is still possible, but you have to repeat the right job label. } -void job(str label, void (void (str message, int worked) step) block, int totalWork=100) { +&T job(str label, &T (void (str message, int worked) step) block, int totalWork=100) { try { jobStart(label, totalWork=totalWork); - block((str message, int worked) { + return block((str message, int worked) { jobStep(label, message, work=worked); }); } @@ -98,10 +98,10 @@ with a parameterized workload and the same label as the job name. @pitfalls{ * additional work with ((jobTodo)) is still possible, but you have to repeat the right job label. } -void job(str label, void (void (int worked) step) block, int totalWork=1) { +&T job(str label, &T (void (int worked) step) block, int totalWork=1) { try { jobStart(label, totalWork=totalWork); - block((int worked) { + return block((int worked) { jobStep(label, label, work=worked); }); } @@ -125,10 +125,10 @@ with workload `1` and the same label as the job name. @pitfalls{ * additional work with ((jobTodo)) is still possible, but you have to repeat the right job label. } -void job(str label, void (void () step) block, int totalWork=1) { +&T job(str label, &T (void () step) block, int totalWork=1) { try { jobStart(label, totalWork=totalWork); - block(() { + return block(() { jobStep(label, label, work=1); }); } @@ -145,10 +145,10 @@ void job(str label, void (void () step) block, int totalWork=1) { * the block code does not need to remember to end the job with the same job name. * the job is always properly ended, even when exceptions are thrown } -void job(str label, void () block, int totalWork=1) { +&T job(str label, &T () block, int totalWork=1) { try { jobStart(label, totalWork=totalWork); - block(); + return block(); } catch x: { throw x; From abb5898f857b85134aaeee22a109cab9364a2194 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 18:34:49 +0200 Subject: [PATCH 077/134] fixed issue with monitor --- .../library/lang/rascal/grammar/ParserGenerator.rsc | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/org/rascalmpl/library/lang/rascal/grammar/ParserGenerator.rsc b/src/org/rascalmpl/library/lang/rascal/grammar/ParserGenerator.rsc index 74839350d67..a673ab7ba37 100644 --- a/src/org/rascalmpl/library/lang/rascal/grammar/ParserGenerator.rsc +++ b/src/org/rascalmpl/library/lang/rascal/grammar/ParserGenerator.rsc @@ -42,8 +42,7 @@ str getParserMethodName(conditional(Symbol s, _)) = getParserMethodName(s); default str getParserMethodName(Symbol s) = value2id(s); public str newGenerate(str package, str name, Grammar gr) { - str src = ""; - job("Generating ", void (void (str m, int w) worked) { + return job("Generating ", str (void (str m, int w) worked) { int uniqueItem = 1; // -1 and -2 are reserved by the SGTDBF implementation int newItem() { uniqueItem += 1; return uniqueItem; }; @@ -87,7 +86,7 @@ public str newGenerate(str package, str name, Grammar gr) { worked("source code template", 1); - src = "package ; + return "package ; ' 'import java.io.IOException; 'import java.io.StringReader; @@ -238,8 +237,7 @@ public str newGenerate(str package, str name, Grammar gr) { ' ' <}> '}"; - }, totalWork=9); - return src; + }, totalWork=9); } rel[int,int] computeDontNests(Items items, Grammar grammar, Grammar uniqueGrammar) { From 785c70fc1d11450f3109f2dce86ff1ae03e6a2bf Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 18:35:47 +0200 Subject: [PATCH 078/134] removed annotations field from m3, has to be part of modifiers for alignment with the AST format --- src/org/rascalmpl/library/analysis/m3/AST.rsc | 9 +++-- .../rascalmpl/library/lang/java/m3/Core.rsc | 40 ++++++++++++------- 2 files changed, 32 insertions(+), 17 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/AST.rsc b/src/org/rascalmpl/library/analysis/m3/AST.rsc index a0ba1013ef0..c5e59a3e72d 100644 --- a/src/org/rascalmpl/library/analysis/m3/AST.rsc +++ b/src/org/rascalmpl/library/analysis/m3/AST.rsc @@ -188,8 +188,11 @@ bool astNodeSpecification(node n, str language = "java", bool checkNameResolutio //TODO: for the benefit of the compiler, changed // assert all(/node m := n, m.decl?, /^/ := decl(m).scheme); //to: - for(/node m := n){ - assert m.decl? && /^/ := decl(m).scheme; + for (/node m := n, m.decl?) { + if (/^/ !:= decl(m).scheme) { + println(" has a strange loc scheme at "); + return false; + } } } @@ -198,7 +201,7 @@ bool astNodeSpecification(node n, str language = "java", bool checkNameResolutio @synopsis{Check the AST node specification on a (large) set of ASTs and monitor the progress.} bool astNodeSpecification(set[node] toCheck, str language = "java", bool checkNameResolution=false, bool checkSourceLocation=true) - = job("AST specification checker", (void (str, int) step) { + = job("AST specification checker", bool (void (str, int) step) { for (node ast <- toCheck) { step(loc l := ast.src ? l.path : "AST without src location", 1); if (!astNodeSpecification(ast, language=language, checkNameResolution=checkNameResolution, checkSourceLocation=checkSourceLocation)) { diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 099f55e014c..aa9fd86d50e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -20,30 +20,43 @@ import util::Reflective; @synopsis{Java extensions to the generic M3 model.} @description{ - Notice that this model also contains the attributes from ((Library:analysis::m3::Core::M3)). +Notice that this model also contains the core attributes from ((Library:analysis::m3::Core::M3)); +in particular `containment`, `declarations`, `modifiers`, `uses`, `types`, and `messages` +are _hot_ for the Java M3 model. + +The additional relations represent specifically static semantic links from the object-oriented +programming paradigm that Java belongs to. However, this only contains facts extracted directly +from source code. The actual static semantic interpretation (type hierarchies, call graphs) +requires an additional analysis step with its own design choices. + +| Ground truth fact kind about source code | Description | +| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `rel[loc from, loc to] extends` | captures class and interface inheritance, classes extend classes and interfaces extend interfaces. Implicit inheritance (i.e. from java.lang.Object) is _not_ included. | +| `rel[loc from, loc to] implements` | which class implements which interfaces (directly, transitive implementation via de extends relation must be derived) +| `rel[loc from, loc to] methodInvocation` | which method potentially invokes which (virtual) method. For a call graph this must be composed with `methodOverrides` | +| `rel[loc from, loc to] fieldAccess` | which method (or static block or field initializer) accesss which fields from which classes | +| `rel[loc from, loc to] typeDependency` | uses of types (literally!) in methods, static blocks and field initializers. | +| `rel[loc from, loc to] methodOverrides` | captures which methods override which other methods from their parents in the inheritance/implements hierarchy. Useful for approximating call graphs. | } data M3( - rel[loc from, loc to] extends = {}, // classes extending classes and interfaces extending interfaces - rel[loc from, loc to] implements = {}, // classes implementing interfaces - rel[loc from, loc to] methodInvocation = {}, // methods calling each other (including constructors) - rel[loc from, loc to] fieldAccess = {}, // code using data (like fields) - rel[loc from, loc to] typeDependency = {}, // using a type literal in some code (types of variables, annotations) - rel[loc from, loc to] methodOverrides = {}, // which method override which other methods - rel[loc declaration, loc annotation] annotations = {} + rel[loc from, loc to] extends = {}, + rel[loc from, loc to] implements = {}, + rel[loc from, loc to] methodInvocation = {}, + rel[loc from, loc to] fieldAccess = {}, + rel[loc from, loc to] typeDependency = {}, + rel[loc from, loc to] methodOverrides = {} ); -data Language(str version="") = java(); - @synopsis{Combines a set of Java meta models by merging their relations.} @memo M3 composeJavaM3(loc id, set[M3] models) = composeM3(id, models); @synopsis{Returns the difference between the first model and the others.} @description{ - Combines `models[1..]` into a single model and then calculates - the difference between `model[0]` and this new joined model. +Combines `models[1..]` into a single model and then calculates +the difference between `model[0]` and this new joined model. - The `id` is the identifier for the returned model. +The `id` is the identifier for the returned model. } @memo M3 diffJavaM3(loc id, list[M3] models) { @@ -60,7 +73,6 @@ M3 diffJavaM3(loc id, list[M3] models) { diff.fieldAccess = first.fieldAccess - others.fieldAccess; diff.typeDependency = first.typeDependency - others.typeDependency; diff.methodOverrides = first.methodOverrides - others.methodOverrides; - diff.annotations = first.annotations - others.annotations; return diff; } From ab97479f8fdedd56b7ee06ea072a0f0b19356daa Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 19:04:48 +0200 Subject: [PATCH 079/134] made start in modeling the Java 9 module system in M3 relations --- .../rascalmpl/library/lang/java/m3/Core.rsc | 40 ++++++++++++++++++- .../lang/java/m3/internal/M3Converter.java | 18 ++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index aa9fd86d50e..20f8f09504c 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -37,6 +37,12 @@ requires an additional analysis step with its own design choices. | `rel[loc from, loc to] fieldAccess` | which method (or static block or field initializer) accesss which fields from which classes | | `rel[loc from, loc to] typeDependency` | uses of types (literally!) in methods, static blocks and field initializers. | | `rel[loc from, loc to] methodOverrides` | captures which methods override which other methods from their parents in the inheritance/implements hierarchy. Useful for approximating call graphs. | +| `rel[loc from, loc to] annotations` | logs which declarations (classes, interfaces, parameters, methods, variables, etc.) are tagged with which annotation classes or interfaces | + +These are the kinds of logical names that can be found in a Java M3 model: +* `|java+class:///|` is a fully resolved and qualified class name +* `|java+interface:///|` is a fully resolved and qualified class name +* (((TODO))) } data M3( rel[loc from, loc to] extends = {}, @@ -44,7 +50,38 @@ data M3( rel[loc from, loc to] methodInvocation = {}, rel[loc from, loc to] fieldAccess = {}, rel[loc from, loc to] typeDependency = {}, - rel[loc from, loc to] methodOverrides = {} + rel[loc from, loc to] methodOverrides = {}, + rel[loc from, loc to] annotations = {} +); + +@synopsis{Extensions for modelling the Java module system} +@description{ +The Java module system was introduced with Java 9. A "module" is a group of related +packages, what is typically called a "component" in general programming terms. A module +definition explains: +* what other modules the current module depends on: `moduleRequiresModule` +* what packages are open to reflection by other modules: `moduleOpensPackage` +* what interfaces are available to other modules (the rest is unavailable by default): `moduleExportsInterface` +* the "services" it uses from other modules: `moduleUsesInterface` +* the "services" it offers to other modules: `moduleProvidesImplementation` + +And so each of these aspects has their own set of facts in the extended M3 model for Java. +} +@benefits{ +* M3 models with the Module system extensions are composable to generate large queriable databases for entire software ecosystems. +* The same module definitions can be extracted from both bytecode (in jar files) and source code. +} +@pitfalls{ +* modules, although they semantically encapsulate packages, interfaces and classes, do not appear in the `containment` relation of the core M3 model. +That is because `containment` represents the static scoping relation of declared source code elements. The relation between modules and what +is inside them is yet another form of encapsulation; so to avoid conflating them they are stored in different relations. +} +data M3( + rel[loc from, loc to] moduleOpensPackage = {}, + rel[loc from, loc to] moduleProvidesImplementation = {}, + rel[loc from, loc to] moduleRequiresModule = {}, + rel[loc from, loc to] moduleUsesInterface = {}, + rel[loc from, loc to] moduleExportsInterface = {} ); @synopsis{Combines a set of Java meta models by merging their relations.} @@ -73,6 +110,7 @@ M3 diffJavaM3(loc id, list[M3] models) { diff.fieldAccess = first.fieldAccess - others.fieldAccess; diff.typeDependency = first.typeDependency - others.typeDependency; diff.methodOverrides = first.methodOverrides - others.methodOverrides; + diff.annotations = first.annotations - others.annotations; return diff; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index a8df693bf53..f22ead05a91 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -32,6 +32,12 @@ public abstract class M3Converter extends JavaToRascalConverter { protected ISetWriter methodOverrides; protected ISetWriter types; protected ISetWriter annotations; + protected ISetWriter moduleOpensPackage; + protected ISetWriter moduleProvidesImplementation; + protected ISetWriter moduleRequiresModule; + protected ISetWriter moduleUsesInterface; + protected ISetWriter moduleExportsInterface; + protected final io.usethesource.vallang.type.Type CONSTRUCTOR_M3; protected final Type JAVA_LANGUAGE_M3; protected ISetWriter languages; @@ -63,6 +69,11 @@ public abstract class M3Converter extends JavaToRascalConverter { annotations = values.setWriter(); types = values.setWriter(); languages = values.setWriter(); + moduleOpensPackage = values.setWriter(); + moduleProvidesImplementation = values.setWriter(); + moduleRequiresModule = values.setWriter(); + moduleUsesInterface = values.setWriter(); + moduleExportsInterface = values.setWriter(); } public IValue getModel(boolean insertErrors) { @@ -82,7 +93,12 @@ public IValue getModel(boolean insertErrors) { setKeywordParameter("names", names.done()); setKeywordParameter("methodOverrides", methodOverrides.done()); setKeywordParameter("types", types.done()); - setKeywordParameter("annotations", annotations.done()); + setKeywordParameter("moduleOpensPackage", moduleOpensPackage.done()); + setKeywordParameter("moduleProvidesImplementation", moduleProvidesImplementation.done()); + setKeywordParameter("moduleRequiresModule", moduleRequiresModule.done()); + setKeywordParameter("moduleUsesInterface", moduleUsesInterface.done()); + setKeywordParameter("moduleExportsInterface", moduleExportsInterface.done()); + insertCompilationUnitMessages(insertErrors, messages.done()); return ownValue; From 6ee6c8c85b88b09ccb1d362135dbca0d70b0877e Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 23:09:34 +0200 Subject: [PATCH 080/134] cleanup, docs, and added @Override --- .../rascalmpl/library/lang/java/m3/Core.rsc | 12 ++- .../java/m3/internal/EclipseJavaCompiler.java | 1 - .../lang/java/m3/internal/JarConverter.java | 3 +- .../m3/internal/JavaToRascalConverter.java | 42 +--------- .../lang/java/m3/internal/M3Converter.java | 1 + .../lang/java/m3/internal/M3LocationUtil.java | 7 +- .../java/m3/internal/SourceConverter.java | 77 +++++++++++++++---- 7 files changed, 76 insertions(+), 67 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 20f8f09504c..5cfa816861f 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -65,7 +65,14 @@ definition explains: * the "services" it uses from other modules: `moduleUsesInterface` * the "services" it offers to other modules: `moduleProvidesImplementation` -And so each of these aspects has their own set of facts in the extended M3 model for Java. +And so each of these aspects has their own set of facts in the extended M3 model for Java: +| Facts about Java modules | Description | +| ---------------------------------------------------- | ------------------------------------------------------- | +| `rel[loc from, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | +| `rel[loc from, loc to] moduleProvidesImplementation` | what services are implemented by this module | +| `rel[loc from, loc to] moduleRequiresModule` | which modules each module requires | +| `rel[loc from, loc to] moduleUsesInterface` | which services are used by every module | +| `rel[loc from, loc to] moduleExportsInterface` | which interfaces are exported by every module | } @benefits{ * M3 models with the Module system extensions are composable to generate large queriable databases for entire software ecosystems. @@ -81,7 +88,8 @@ data M3( rel[loc from, loc to] moduleProvidesImplementation = {}, rel[loc from, loc to] moduleRequiresModule = {}, rel[loc from, loc to] moduleUsesInterface = {}, - rel[loc from, loc to] moduleExportsInterface = {} + rel[loc from, loc to] moduleExportsInterface = {}, + rel[loc from, loc to] moduleHidesInterface = {} ); @synopsis{Combines a set of Java meta models by merging their relations.} diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index d803acf3143..4a98958ed36 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -139,7 +139,6 @@ public IValue createM3FromString(ISourceLocation loc, IString contents, IBool er return createM3FromString(loc, contents, errorRecovery, sourcePath, classPath, javaVersion, getM3Store()); } - protected IValue createM3FromString(ISourceLocation loc, IString contents, IBool errorRecovery, IList sourcePath, IList classPath, IConstructor javaVersion, LimitedTypeStore store) { try { CompilationUnit cu = getCompilationUnit(loc.getPath(), contents.getValue().toCharArray(), true, errorRecovery.getValue(), javaVersion, translatePaths(sourcePath), translatePaths(classPath)); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index 8b077750d94..cda18932700 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -407,7 +407,8 @@ private void setMethodOverridesRelation(String superClass, MethodNode methodNode List superMethods = classNode.methods; if (superMethods != null) { - for (MethodNode superMethodNode : superMethods) { + for (MethodNode superMethodNode : superMethods) { + // TODO: equals is to strict, methods can be overridden even if the parameters have different types. if (superMethodNode.name.equals(methodNode.name) && superMethodNode.desc.equals(methodNode.desc)) { diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index ebabf5cfb62..89853423918 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -90,34 +90,6 @@ public abstract class JavaToRascalConverter extends ASTVisitor { messages = values.listWriter(); } - /** - * The JDT's AST format stores list of modifiers separately from lists of annotations, even though - * syntactically they may occur in arbitrary order before most declaration kinds in Java. To recreate - * a properly ordered AST, this helper functions merges the lists again in order of appearance - */ - protected IList mergeModifiersAndAnnotationsInOrderOfAppearance(IList modifiers, IList annotations) { - if (modifiers == null && annotations == null) { - return values.list(); - } - else if (modifiers == null) { - return annotations; - } - else if (annotations == null) { - return modifiers; - } - - var everything = modifiers.concat(annotations); - - return everything.stream() - .map(v -> (IConstructor) v) - .sorted((IConstructor a, IConstructor b) -> Integer.compare(location(a).getOffset(), location(b).getOffset())) - .collect(values.listWriter()); - } - - private ISourceLocation location(IValue ast) { - return (ISourceLocation) ((IConstructor) ast).asWithKeywordParameters().getParameter("src"); - } - protected ISourceLocation resolveBinding(String packageComponent) { ISourceLocation packageBinding = new BindingsResolver(typeStore, locationCache, this.collectBindings) { public ISourceLocation resolveBinding(String packageC) { @@ -203,7 +175,8 @@ protected ISourceLocation getSourceLocation(ASTNode node) { // TODO: only adding 1 at the end seems to work, need to test. compilUnit.getColumnNumber(start), compilUnit.getColumnNumber(end) + 1); } - } catch (IllegalArgumentException e) { + } + catch (IllegalArgumentException e) { insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, values.string("Most probably missing dependency"), values.sourceLocation(loc, 0, 0))); @@ -211,17 +184,6 @@ protected ISourceLocation getSourceLocation(ASTNode node) { return values.sourceLocation(loc, 0, 0, 0, 0, 0, 0); } - /* unused */ - /* - protected IList parseExtendedModifiers(BodyDeclaration node) { - if (node.getAST().apiLevel() == AST.JLS2) { - return parseModifiers(node.getModifiers()); - } else { - return parseExtendedModifiers(node.modifiers()); - } - } - */ - protected IValue visitChild(ASTNode node) { node.accept(this); return this.getValue(); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index f22ead05a91..01be263eb41 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -41,6 +41,7 @@ public abstract class M3Converter extends JavaToRascalConverter { protected final io.usethesource.vallang.type.Type CONSTRUCTOR_M3; protected final Type JAVA_LANGUAGE_M3; protected ISetWriter languages; + protected ISourceLocation currentModule = null; M3Converter(final LimitedTypeStore typeStore, java.util.Map cache, IConstructor javaVersion) { this(typeStore, cache); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java index 9508eb25d9d..cd9d1e43e40 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3LocationUtil.java @@ -62,12 +62,7 @@ public static ISourceLocation makeLocation(ISourceLocation uri, int offset, int * @return extended location */ public static ISourceLocation extendPath(ISourceLocation uri, String path) { - try { - return URIUtil.changePath(uri, uri.getPath() + "/" + path); - } - catch (URISyntaxException e) { - throw new RuntimeException("Extending path error with URIUtil", e); - } + return URIUtil.getChildLocation(uri, path); } /** diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java index 80973690eda..fee06d45f6b 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java @@ -81,12 +81,12 @@ private boolean simpleNameIsConstructorDecl(SimpleName node) { } private void addTypeDependency(ISourceLocation dependency) { - if (!scopeManager.isEmpty()) { - ISourceLocation parent = getParent(); - if (!parent.equals(dependency)) { - insert(typeDependency, parent, dependency); - } - } + if (!scopeManager.isEmpty()) { + ISourceLocation parent = getParent(); + if (!parent.equals(dependency)) { + insert(typeDependency, parent, dependency); + } + } } public void preVisit(ASTNode node) { @@ -97,29 +97,34 @@ public void preVisit(ASTNode node) { ownValue = resolveBinding(node); } + @Override public boolean visit(AnnotationTypeDeclaration node) { insert(containment, getParent(), ownValue); scopeManager.push((ISourceLocation) ownValue); return true; } + @Override public void endVisit(AnnotationTypeDeclaration node) { ownValue = scopeManager.pop(); computeTypeSymbol(node); } + @Override public boolean visit(AnnotationTypeMemberDeclaration node) { insert(containment, getParent(), ownValue); scopeManager.push((ISourceLocation) ownValue); return true; } + @Override public void endVisit(AnnotationTypeMemberDeclaration node) { ownValue = scopeManager.pop(); IConstructor type = bindingsResolver.resolveType(node.getType().resolveBinding(), true); insert(types, ownValue, type); } + @Override public boolean visit(AnonymousClassDeclaration node) { insert(containment, getParent(), ownValue); // enum constant declaration and classinstancecreation gives types for anonymousclasses @@ -151,47 +156,57 @@ else if (parent instanceof EnumConstantDeclaration) { return true; } + @Override public void endVisit(AnonymousClassDeclaration node) { ownValue = scopeManager.pop(); } + @Override public boolean visit(BlockComment node) { insert(documentation, resolveBinding(node.getAlternateRoot()), getSourceLocation(node)); return true; } + @Override public boolean visit(ClassInstanceCreation node) { insert(methodInvocation, getParent(), ownValue); insert(uses, getSourceLocation(node), ownValue); return true; } + @Override public boolean visit(CompilationUnit node) { insert(declarations, ownValue, getSourceLocation(node)); scopeManager.push((ISourceLocation) ownValue); return true; } + @Override public void endVisit(CompilationUnit node) { ownValue = scopeManager.pop(); } + @Override public boolean visit(ConstructorInvocation node) { insert(methodInvocation, getParent(), ownValue); return true; } + @Override public boolean visit(EnumConstantDeclaration node) { insert(containment, getParent(), ownValue); scopeManager.push((ISourceLocation) ownValue); return true; } + @Override public void endVisit(EnumConstantDeclaration node) { ownValue = scopeManager.pop(); } + @Override public boolean visit(EnumDeclaration node) { + // TODO: enums can have methods that override as well insert(containment, getParent(), ownValue); IListWriter implementedInterfaces = values.listWriter(); @@ -207,26 +222,30 @@ public boolean visit(EnumDeclaration node) { return true; } + @Override public void endVisit(EnumDeclaration node) { ownValue = scopeManager.pop(); - computeTypeSymbol(node); + computeTypeSymbol(node); } - private void computeTypeSymbol(AbstractTypeDeclaration node) { - IConstructor type = bindingsResolver.resolveType(node.resolveBinding(), true); - insert(types, ownValue, type); - } + private void computeTypeSymbol(AbstractTypeDeclaration node) { + IConstructor type = bindingsResolver.resolveType(node.resolveBinding(), true); + insert(types, ownValue, type); + } + @Override public boolean visit(FieldAccess node) { insert(fieldAccess, getParent(), ownValue); return true; } + @Override public boolean visit(FieldDeclaration node) { visitFragments(node.fragments()); return false; } + @Override public boolean visit(Initializer node) { insert(containment, getParent(), ownValue); insert(declarations, ownValue, getSourceLocation(node)); @@ -234,10 +253,12 @@ public boolean visit(Initializer node) { return true; } + @Override public void endVisit(Initializer node) { ownValue = scopeManager.pop(); } + @Override public boolean visit(Javadoc node) { ASTNode parent = node.getParent(); if (parent == null) { @@ -260,17 +281,20 @@ public boolean visit(Javadoc node) { return false; } + @Override public boolean visit(LineComment node) { insert(documentation, resolveBinding(node.getAlternateRoot()), getSourceLocation(node)); return true; } + @Override public boolean visit(MethodDeclaration node) { insert(containment, getParent(), ownValue); scopeManager.push((ISourceLocation) ownValue); return true; } + @Override public void endVisit(MethodDeclaration node) { ownValue = scopeManager.pop(); ASTNode parent = node.getParent(); @@ -311,12 +335,14 @@ private void fillOverrides(IMethodBinding node, ITypeBinding parent) { } } + @Override public boolean visit(MethodInvocation node) { insert(methodInvocation, getParent(), ownValue); //TODO: add to uses as well return true; } + @Override public boolean visit(Modifier node) { String modifier = node.getKeyword().toString(); insert(modifiers, getParent(), constructModifierNode(modifier)); @@ -327,9 +353,9 @@ private void generatePackageDecls(ISourceLocation parent, ISourceLocation pkg, I insert(declarations, pkg, folder); if (!(parent == null)) { - insert(containment, parent, pkg); - pkg = parent; - generatePackageDecls(getParent(pkg), pkg, getParent(folder)); + insert(containment, parent, pkg); + pkg = parent; + generatePackageDecls(getParent(pkg), pkg, getParent(folder)); } } @@ -341,13 +367,15 @@ private ISourceLocation getParent(ISourceLocation sourceLoc) { return result; } + @Override public boolean visit(PackageDeclaration node) { IPackageBinding binding = node.resolveBinding(); if (binding != null) { generatePackageDecls(getParent((ISourceLocation) ownValue), (ISourceLocation) ownValue, getParent(loc)); insert(containment, ownValue, getParent()); - } else { + } + else { insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, values.string("Unresolved binding for: " + node), values.sourceLocation(loc, 0, 0))); @@ -357,10 +385,12 @@ public boolean visit(PackageDeclaration node) { return true; } + @Override public void endVisit(PackageDeclaration node) { ownValue = scopeManager.pop(); } + @Override public boolean visit(QualifiedName node) { if (((ISourceLocation) ownValue).getScheme().equals("java+field")) { insert(fieldAccess, getParent(), ownValue); @@ -368,6 +398,7 @@ public boolean visit(QualifiedName node) { return true; } + @Override public boolean visit(SimpleName node) { insert(names, values.string(node.getIdentifier()), ownValue); @@ -381,6 +412,7 @@ public boolean visit(SimpleName node) { return true; } + @Override public void endVisit(SimpleName node) { if ((node.isDeclaration() || simpleNameIsConstructorDecl(node))) { insert(declarations, ownValue, getSourceLocation(compilUnit.findDeclaringNode(node.resolveBinding()))); @@ -393,33 +425,39 @@ public void endVisit(SimpleName node) { } } + @Override public boolean visit(SingleVariableDeclaration node) { insert(containment, getParent(), ownValue); scopeManager.push((ISourceLocation) ownValue); return true; } + @Override public void endVisit(SingleVariableDeclaration node) { ownValue = scopeManager.pop(); IConstructor type = bindingsResolver.resolveType(node.getType().resolveBinding(), false); insert(types, ownValue, type); } + @Override public boolean visit(SuperConstructorInvocation node) { insert(methodInvocation, getParent(), ownValue); return true; } + @Override public boolean visit(SuperFieldAccess node) { insert(fieldAccess, getParent(), ownValue); return true; } + @Override public boolean visit(SuperMethodInvocation node) { insert(methodInvocation, getParent(), ownValue); return true; } + @Override public boolean visit(TypeDeclaration node) { insert(containment, getParent(), ownValue); @@ -453,7 +491,8 @@ else if (node.getAST().apiLevel() >= AST.JLS3) { if (node.isInterface()) { insert(extendsRelations, ownValue, implementsInterfaces.done()); - } else { + } + else { insert(extendsRelations, ownValue, extendsClass.done()); insert(implementsRelations, ownValue, implementsInterfaces.done()); } @@ -461,12 +500,13 @@ else if (node.getAST().apiLevel() >= AST.JLS3) { return true; } - + @Override public void endVisit(TypeDeclaration node) { ownValue = scopeManager.pop(); computeTypeSymbol(node); } + @Override public boolean visit(TypeParameter node) { IListWriter extendsList = values.listWriter(); if (!node.typeBounds().isEmpty()) { @@ -481,11 +521,13 @@ public boolean visit(TypeParameter node) { return true; } + @Override public boolean visit(VariableDeclarationExpression node) { visitFragments(node.fragments()); return false; } + @Override public boolean visit(VariableDeclarationFragment node) { insert(containment, getParent(), ownValue); scopeManager.push((ISourceLocation) ownValue); @@ -524,6 +566,7 @@ else if (parentASTNode instanceof VariableDeclarationExpression) { return true; } + @Override public boolean visit(VariableDeclarationStatement node) { visitFragments(node.fragments()); return false; From 2bd241fde8d58336be54e219459bccc013d8be77 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 25 Apr 2024 23:43:46 +0200 Subject: [PATCH 081/134] initial implementation of M3 construction for module system from source code --- .../rascalmpl/library/lang/java/m3/AST.rsc | 2 +- .../rascalmpl/library/lang/java/m3/Core.rsc | 10 +- .../lang/java/m3/internal/ASTConverter.java | 2 +- .../lang/java/m3/internal/M3Converter.java | 6 ++ .../java/m3/internal/SourceConverter.java | 94 +++++++++++++++++++ 5 files changed, 107 insertions(+), 7 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 443f41ac92d..cfc94ff6a99 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -122,7 +122,7 @@ data Declaration | \providesImplementations(Expression interface, list[Expression] implementations) | \requires(list[Modifier] mods, Expression \moduleName) | \uses(Expression interface) - | \exports(Expression interface) + | \exports(Expression interface, list[Expression] to) ; diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 5cfa816861f..1e9d3723beb 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -68,11 +68,11 @@ definition explains: And so each of these aspects has their own set of facts in the extended M3 model for Java: | Facts about Java modules | Description | | ---------------------------------------------------- | ------------------------------------------------------- | -| `rel[loc from, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | -| `rel[loc from, loc to] moduleProvidesImplementation` | what services are implemented by this module | -| `rel[loc from, loc to] moduleRequiresModule` | which modules each module requires | -| `rel[loc from, loc to] moduleUsesInterface` | which services are used by every module | -| `rel[loc from, loc to] moduleExportsInterface` | which interfaces are exported by every module | +| `rel[loc module, loc package, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | +| `rel[loc module, loc service, loc implementation] moduleProvidesImplementation` | what services are implemented by this module | +| `rel[loc module, loc requiredModule] moduleRequiresModule` | which modules each module requires | +| `rel[loc module, loc service] moduleUsesInterface` | which services are used by every module | +| `rel[loc module, loc service, loc to] moduleExportsInterface` | which interfaces are exported by every module | } @benefits{ * M3 models with the Module system extensions are composable to generate large queriable databases for entire software ecosystems. diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 8d7f0ef3399..450c8ceabc8 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -1418,7 +1418,7 @@ public boolean visit(UsesDirective node) { public boolean visit(ExportsDirective node) { IValue name = visitChild(node.getName()); - ownValue = constructDeclarationNode("exports", name); + ownValue = constructDeclarationNode("exports", name, visitChildren(node.modules())); return false; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index 01be263eb41..d15e4f5e0d1 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -115,6 +115,12 @@ public void insert(ISetWriter relW, IValue lhs, IValue rhs) { } } + public void insert(ISetWriter relW, IValue lhs, IValue middle, IValue rhs) { + if ((isValid((ISourceLocation) lhs) && isValid((ISourceLocation) middle) && isValid((ISourceLocation) rhs))) { + relW.insert(values.tuple(lhs, middle, rhs)); + } + } + public void insert(ISetWriter relW, IValue lhs, IList rhs) { for (IValue oneRHS: rhs) { if (lhs.getType().isString() || (isValid((ISourceLocation) lhs) && isValid((ISourceLocation) oneRHS))) { diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java index fee06d45f6b..afa7eaa8f10 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java @@ -19,6 +19,7 @@ import org.eclipse.jdt.core.dom.ConstructorInvocation; import org.eclipse.jdt.core.dom.EnumConstantDeclaration; import org.eclipse.jdt.core.dom.EnumDeclaration; +import org.eclipse.jdt.core.dom.ExportsDirective; import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IMethodBinding; @@ -31,9 +32,13 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.Modifier; +import org.eclipse.jdt.core.dom.ModuleDeclaration; import org.eclipse.jdt.core.dom.Name; +import org.eclipse.jdt.core.dom.OpensDirective; import org.eclipse.jdt.core.dom.PackageDeclaration; +import org.eclipse.jdt.core.dom.ProvidesDirective; import org.eclipse.jdt.core.dom.QualifiedName; +import org.eclipse.jdt.core.dom.RequiresDirective; import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.SuperConstructorInvocation; @@ -42,6 +47,7 @@ import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.TypeParameter; +import org.eclipse.jdt.core.dom.UsesDirective; import org.eclipse.jdt.core.dom.VariableDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationExpression; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; @@ -181,6 +187,94 @@ public boolean visit(CompilationUnit node) { return true; } + @Override + public boolean visit(ModuleDeclaration node) { + insert(declarations, ownValue, getSourceLocation(node)); + scopeManager.push(getSourceLocation(node)); + return true; + } + + @Override + public void endVisit(ModuleDeclaration node) { + scopeManager.pop(); + } + + @Override + public boolean visit(RequiresDirective node) { + var parent = scopeManager.peek(); + var name = resolveBinding(node.getName()); + // TODO: encode static and transitive modifiers somehow in the modifiers relation, or in the moduleRequires relation + insert(moduleRequiresModule, parent, name); + return true; + } + + @Override + public boolean visit(ExportsDirective node) { + var parent = scopeManager.peek(); + var targets = ((List) node.modules()) + .stream() + .map(o -> ((ASTNode) o)) + .map(n -> resolveBinding(n)).collect(values.listWriter()); + var name = resolveBinding(node.getName()); + + if (targets.isEmpty()) { + // this encodes unqualified exports to all other modules + insert(moduleExportsInterface, parent, name, URIUtil.rootLocation("java+module")); + } + else { + for (var target : targets) { + insert(moduleExportsInterface, parent, name , target); + } + } + + return true; + } + + @Override + public boolean visit(ProvidesDirective node) { + var parent = scopeManager.peek(); + var implementations = ((List) node.implementations()) + .stream() + .map(o -> ((ASTNode) o)) + .map(n -> resolveBinding(n)).collect(values.listWriter()); + var name = resolveBinding(node.getName()); + + for (var impl : implementations) { + insert(moduleProvidesImplementation, parent, name, impl); + } + + return true; + } + + @Override + public boolean visit(UsesDirective node) { + var parent = scopeManager.peek(); + insert(moduleUsesInterface, parent, resolveBinding(node.getName())); + return true; + } + + @Override + public boolean visit(OpensDirective node) { + var parent = scopeManager.peek(); + var name = resolveBinding(node.getName()); + var modules = ((List) node.modules()) + .stream() + .map(o -> ((ASTNode) o)) + .map(n -> resolveBinding(n)).collect(values.listWriter()); + + if (modules.isEmpty()) { + // this encodes unqualified opening to all other modules + insert(moduleOpensPackage, parent, name, URIUtil.rootLocation("java+module")); + } + else { + for (var module : modules) { + insert(moduleOpensPackage, parent, name, module); + } + } + + return true; + } + @Override public void endVisit(CompilationUnit node) { ownValue = scopeManager.pop(); From 57db654b75b2c41d68ee6b09b50e700f59e9f339 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 26 Apr 2024 12:13:52 +0200 Subject: [PATCH 082/134] fixed missing implementation of name-qualified field types and issues with trying to compute types for module names --- .../rascalmpl/library/lang/java/m3/AST.rsc | 3 ++- .../lang/java/m3/internal/ASTConverter.java | 25 +++++++++++++++++-- .../java/m3/internal/EclipseJavaCompiler.java | 3 +-- .../java/m3/internal/IBindingsResolver.java | 4 ++- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index cfc94ff6a99..08952ab5a60 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -252,7 +252,8 @@ an abstract syntax tree ((Type)), which becomes this ((TypeSymbol)): `array(clas data Type(TypeSymbol typ=unresolved()) = arrayType(Type \type) | parameterizedType(Type \type, list[Type] typeArguments) - | qualifiedType(Type qualifier, Expression simpleName) + | qualifiedType(list[Modifier] annotations, Type typeQualifier, Expression simpleName) + | qualifiedType(list[Modifier] annotations, Expression nameQualifier, Expression simpleName) | simpleType(Expression typeName) | unionType(list[Type] types) | intersectionType(list[Type] types) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 450c8ceabc8..94ab446cba0 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -14,6 +14,8 @@ *******************************************************************************/ package org.rascalmpl.library.lang.java.m3.internal; +import java.io.IOException; +import java.io.StringReader; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -27,6 +29,8 @@ import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; +import io.usethesource.vallang.exceptions.FactTypeUseException; +import io.usethesource.vallang.io.StandardTextReader; import io.usethesource.vallang.type.TypeFactory; /** @@ -58,7 +62,10 @@ public void postVisit(ASTNode node) { if (!decl.getScheme().equals("unknown")) { setKeywordParameter("decl", decl); } - if (getAdtType() != DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE && !decl.getScheme().equals("java+package")) { + if (getAdtType() != DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE + && !decl.getScheme().equals("java+package") + && !decl.getScheme().equals("java+module") + && !(node instanceof ModuleDeclaration)) { IValue type = resolveType(node); setKeywordParameter("typ", type); @@ -565,6 +572,7 @@ public boolean visit(FieldAccess node) { @Override public boolean visit(FieldDeclaration node) { IList modifiers = visitChildren(node.modifiers()); + IValue type = visitChild(node.getType()); IListWriter fragments = values.listWriter(); @@ -726,6 +734,18 @@ public boolean visit(InfixExpression node) { return false; } + @Override + public boolean visit(NameQualifiedType node) { + IValue qualifier = visitChild(node.getQualifier()); + IList annos = visitChildren(node.annotations()); + + IValue name = visitChild(node.getName()); + + ownValue = constructTypeNode("qualifiedType", annos, qualifier, name); + + return false; + } + @Override public boolean visit(Initializer node) { IList modifiers = visitChildren(node.modifiers()); @@ -1075,10 +1095,11 @@ public boolean visit(QualifiedName node) { @Override public boolean visit(QualifiedType node) { IValue qualifier = visitChild(node.getQualifier()); + IList annos = visitChildren(node.annotations()); IValue name = visitChild(node.getName()); - ownValue = constructTypeNode("qualifiedType", qualifier, name); + ownValue = constructTypeNode("qualifiedType", annos, qualifier, name); return false; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java index 4a98958ed36..de30b372a52 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/EclipseJavaCompiler.java @@ -199,9 +199,8 @@ protected void buildCompilationUnits(ISet files, boolean resolveBindings, boolea for (IValue f : files) { fastPath &= safeResolve((ISourceLocation)f).getScheme().equals("file"); } + if (fastPath) { - monitor.jobStart("Mapping syntax trees", files.size()); - Map reversePathLookup = new HashMap<>(); String[] absolutePaths = new String[files.size()]; String[] encodings = new String[absolutePaths.length]; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/IBindingsResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/IBindingsResolver.java index 8a2adf5ba7f..b9f4a01f213 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/IBindingsResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/IBindingsResolver.java @@ -24,6 +24,7 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.MethodRef; +import org.eclipse.jdt.core.dom.ModuleDeclaration; import org.eclipse.jdt.core.dom.Name; import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.SuperConstructorInvocation; @@ -46,7 +47,8 @@ public interface IBindingsResolver { public ISourceLocation resolveBinding(MethodDeclaration node); public ISourceLocation resolveBinding(MethodRef node); // Java doc public ISourceLocation resolveBinding(Name node); // Expression - public ISourceLocation resolveBinding(PackageDeclaration node); + public ISourceLocation resolveBinding(PackageDeclaration node); + public ISourceLocation resolveBinding(ModuleDeclaration node); public ISourceLocation resolveBinding(Type node); // type public ISourceLocation resolveBinding(TypeParameter node); // type public ISourceLocation resolveBinding(VariableDeclaration node); // declaration From 02ddddd58516c36a7225619ab380049a2dad7cad Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 26 Apr 2024 12:26:04 +0200 Subject: [PATCH 083/134] fixed several issues in M3 extractor --- src/org/rascalmpl/library/analysis/m3/Core.rsc | 6 +++--- .../library/lang/java/m3/internal/ASTConverter.java | 4 ---- .../lang/java/m3/internal/JavaToRascalConverter.java | 11 +++++++---- .../lang/java/m3/internal/SourceConverter.java | 10 +++++++--- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/Core.rsc b/src/org/rascalmpl/library/analysis/m3/Core.rsc index e615050439b..9f9854af69a 100644 --- a/src/org/rascalmpl/library/analysis/m3/Core.rsc +++ b/src/org/rascalmpl/library/analysis/m3/Core.rsc @@ -164,13 +164,13 @@ and intermediate memory allocation which can be detrimental when doing large who @memo M3 composeM3(loc id, set[M3] models) { M3 comp = m3(id); - fields = (m:getKeywordParameters(m) | m <- models); + flds = (m:getKeywordParameters(m) | m <- models); keys = {*domain(getKeywordParameters(m)) | m <- models }; result = (); // first we do only the sets, to use efficient set union/splicing for (k <- keys) { - newSet = {*elems | m <- models, set[value] elems := fields[m][k]}; + newSet = {*elems | m <- models, set[value] elems := flds[m][k]}; if (newSet != {}) { // don't set anything if the result is empty (it could be a list!) result[k] = newSet; } @@ -178,7 +178,7 @@ M3 composeM3(loc id, set[M3] models) { // then we do only the lists, to use efficient list splicing for (k <- keys) { - newList = [*elems | m <- models, list[value] elems := fields[m][k]]; + newList = [*elems | m <- models, list[value] elems := flds[m][k]]; if (newList != []) { // don't set anything if the result is empty (it could be a set!) result[k] = newList; } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index 94ab446cba0..d5ed758c40a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -14,8 +14,6 @@ *******************************************************************************/ package org.rascalmpl.library.lang.java.m3.internal; -import java.io.IOException; -import java.io.StringReader; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -29,8 +27,6 @@ import io.usethesource.vallang.ISourceLocation; import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; -import io.usethesource.vallang.exceptions.FactTypeUseException; -import io.usethesource.vallang.io.StandardTextReader; import io.usethesource.vallang.type.TypeFactory; /** diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 89853423918..ce80113fa7f 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -62,7 +62,8 @@ public abstract class JavaToRascalConverter extends ASTVisitor { protected final io.usethesource.vallang.type.Type DATATYPE_RASCAL_AST_TYPE_NODE_TYPE; protected final io.usethesource.vallang.type.Type DATATYPE_RASCAL_AST_MODIFIER_NODE_TYPE; protected final io.usethesource.vallang.type.Type DATATYPE_RASCAL_MESSAGE_DATA_TYPE; - protected final io.usethesource.vallang.type.Type DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE; + protected final io.usethesource.vallang.type.Type DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE1; + protected final io.usethesource.vallang.type.Type DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2; protected CompilationUnit compilUnit; protected ISourceLocation loc; @@ -84,7 +85,9 @@ public abstract class JavaToRascalConverter extends ASTVisitor { this.DATATYPE_RASCAL_AST_EXPRESSION_NODE_TYPE = typeStore.lookupAbstractDataType(DATATYPE_RASCAL_AST_EXPRESSION_NODE); this.DATATYPE_RASCAL_AST_STATEMENT_NODE_TYPE = typeStore.lookupAbstractDataType(DATATYPE_RASCAL_AST_STATEMENT_NODE); DATATYPE_RASCAL_MESSAGE_DATA_TYPE = typeStore.lookupAbstractDataType(DATATYPE_RASCAL_MESSAGE); - DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE = typeStore.lookupConstructor(DATATYPE_RASCAL_MESSAGE_DATA_TYPE, DATATYPE_RASCAL_MESSAGE_ERROR).iterator().next(); + TypeFactory tf = TypeFactory.getInstance(); + DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE1 = typeStore.lookupConstructor(DATATYPE_RASCAL_MESSAGE_DATA_TYPE, DATATYPE_RASCAL_MESSAGE_ERROR, tf.tupleType(tf.stringType())); + DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2 = typeStore.lookupConstructor(DATATYPE_RASCAL_MESSAGE_DATA_TYPE, DATATYPE_RASCAL_MESSAGE_ERROR, tf.tupleType(tf.stringType(), tf.sourceLocationType())); this.locationCache = cache; messages = values.listWriter(); @@ -161,7 +164,7 @@ protected ISourceLocation getSourceLocation(ASTNode node) { int end = start + nodeLength -1; if (end < start && ((node.getFlags() & 9) > 0)) { - insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, + insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2, values.string("Recovered/Malformed node, guessing the length"), values.sourceLocation(loc, 0, 0))); @@ -177,7 +180,7 @@ protected ISourceLocation getSourceLocation(ASTNode node) { } } catch (IllegalArgumentException e) { - insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, + insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2, values.string("Most probably missing dependency"), values.sourceLocation(loc, 0, 0))); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java index afa7eaa8f10..0cd2cdd6469 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java @@ -28,6 +28,7 @@ import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.Initializer; import org.eclipse.jdt.core.dom.Javadoc; +import org.eclipse.jdt.core.dom.LambdaExpression; import org.eclipse.jdt.core.dom.LineComment; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; @@ -406,7 +407,7 @@ else if (parent instanceof AnonymousClassDeclaration) { private void fillOverrides(IMethodBinding node, ITypeBinding parent) { if (node == null || parent == null) { - insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, + insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2, values.string("parent or method binding is null, not proceeding with fillOverrides"), getSourceLocation(compilUnit.findDeclaringNode(node)))); return; @@ -470,7 +471,7 @@ public boolean visit(PackageDeclaration node) { insert(containment, ownValue, getParent()); } else { - insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, + insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2, values.string("Unresolved binding for: " + node), values.sourceLocation(loc, 0, 0))); } @@ -632,7 +633,7 @@ public boolean visit(VariableDeclarationFragment node) { insert(types, ownValue, type); } else { - insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE, + insert(messages, values.constructor(DATATYPE_RASCAL_MESSAGE_ERROR_NODE_TYPE2, values.string("No binding for: " + node), values.sourceLocation(loc, 0, 0))); } @@ -651,6 +652,9 @@ else if (parentASTNode instanceof VariableDeclarationExpression) { parent.getType().accept(this); visitListOfModifiers(parent.modifiers()); } + else if (parentASTNode instanceof LambdaExpression) { + // skip, there is nothing to extract in terms of modifiers from lambda's + } else { VariableDeclarationStatement parent = (VariableDeclarationStatement)parentASTNode; parent.getType().accept(this); From 3974b11b5ca55b98ffe17fb0e0be69845beea1cc Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 26 Apr 2024 12:52:21 +0200 Subject: [PATCH 084/134] fixed bug in generic composeM3 function --- src/org/rascalmpl/library/analysis/m3/Core.rsc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/Core.rsc b/src/org/rascalmpl/library/analysis/m3/Core.rsc index 9f9854af69a..62b107a367e 100644 --- a/src/org/rascalmpl/library/analysis/m3/Core.rsc +++ b/src/org/rascalmpl/library/analysis/m3/Core.rsc @@ -164,13 +164,13 @@ and intermediate memory allocation which can be detrimental when doing large who @memo M3 composeM3(loc id, set[M3] models) { M3 comp = m3(id); - flds = (m:getKeywordParameters(m) | m <- models); - keys = {*domain(getKeywordParameters(m)) | m <- models }; - result = (); + map[M3, map[str,value]] fields = (m:getKeywordParameters(m) | m <- models); + set[str] keys = {*domain(getKeywordParameters(m)) | m <- models }; + map[str, value] result = (); // first we do only the sets, to use efficient set union/splicing for (k <- keys) { - newSet = {*elems | m <- models, set[value] elems := flds[m][k]}; + newSet = {*elems | M3 m <- models, set[value] elems := fields[m][k]}; if (newSet != {}) { // don't set anything if the result is empty (it could be a list!) result[k] = newSet; } @@ -178,7 +178,7 @@ M3 composeM3(loc id, set[M3] models) { // then we do only the lists, to use efficient list splicing for (k <- keys) { - newList = [*elems | m <- models, list[value] elems := flds[m][k]]; + newList = [*elems | m <- models, list[value] elems := fields[m][k]]; if (newList != []) { // don't set anything if the result is empty (it could be a set!) result[k] = newList; } From a039bccf9d4126788dc36a5f83dc089953cfbe1d Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 26 Apr 2024 12:52:42 +0200 Subject: [PATCH 085/134] debugging the M3 model creator using jsoup as an example because it has a module-info.java file --- .../rascalmpl/library/lang/java/m3/Core.rsc | 21 +++--- .../java/m3/internal/BindingsResolver.java | 73 +++++++++++++------ .../m3/internal/JavaToRascalConverter.java | 2 + .../java/m3/internal/SourceConverter.java | 2 +- 4 files changed, 63 insertions(+), 35 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 1e9d3723beb..e0732795b81 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -68,11 +68,11 @@ definition explains: And so each of these aspects has their own set of facts in the extended M3 model for Java: | Facts about Java modules | Description | | ---------------------------------------------------- | ------------------------------------------------------- | -| `rel[loc module, loc package, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | -| `rel[loc module, loc service, loc implementation] moduleProvidesImplementation` | what services are implemented by this module | -| `rel[loc module, loc requiredModule] moduleRequiresModule` | which modules each module requires | -| `rel[loc module, loc service] moduleUsesInterface` | which services are used by every module | -| `rel[loc module, loc service, loc to] moduleExportsInterface` | which interfaces are exported by every module | +| `rel[loc \module, loc package, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | +| `rel[loc \module, loc service, loc implementation] moduleProvidesImplementation` | what services are implemented by this module | +| `rel[loc \module, loc requiredModule] moduleRequiresModule` | which modules each module requires | +| `rel[loc \module, loc service] moduleUsesInterface` | which services are used by every module | +| `rel[loc \module, loc service, loc to] moduleExportsInterface` | which interfaces are exported by every module | } @benefits{ * M3 models with the Module system extensions are composable to generate large queriable databases for entire software ecosystems. @@ -84,12 +84,11 @@ That is because `containment` represents the static scoping relation of declared is inside them is yet another form of encapsulation; so to avoid conflating them they are stored in different relations. } data M3( - rel[loc from, loc to] moduleOpensPackage = {}, - rel[loc from, loc to] moduleProvidesImplementation = {}, - rel[loc from, loc to] moduleRequiresModule = {}, - rel[loc from, loc to] moduleUsesInterface = {}, - rel[loc from, loc to] moduleExportsInterface = {}, - rel[loc from, loc to] moduleHidesInterface = {} + rel[loc \module, loc package, loc to] moduleOpensPackage = {}, + rel[loc \module, loc service, loc implementation] moduleProvidesImplementation = {}, + rel[loc \module, loc requiredModule] moduleRequiresModule = {}, + rel[loc \module, loc service] moduleUsesInterface = {}, + rel[loc \module, loc service, loc to] moduleExportsInterface = {} ); @synopsis{Combines a set of Java meta models by merging their relations.} diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java index 30eb4ce8182..ed4894a220a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java @@ -36,6 +36,7 @@ import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.MethodInvocation; import org.eclipse.jdt.core.dom.MethodRef; +import org.eclipse.jdt.core.dom.ModuleDeclaration; import org.eclipse.jdt.core.dom.PackageDeclaration; import org.eclipse.jdt.core.dom.QualifiedName; import org.eclipse.jdt.core.dom.SimpleName; @@ -81,51 +82,77 @@ public ISourceLocation resolveBinding(ASTNode node, boolean tryHard) { if (collectBindings) { if (node instanceof TypeDeclaration) { return resolveBinding(((TypeDeclaration) node).resolveBinding()); - } else if (node instanceof EnumDeclaration) { + } + else if (node instanceof ModuleDeclaration) { + return resolveBinding(((ModuleDeclaration) node).resolveBinding()); + } + else if (node instanceof EnumDeclaration) { return resolveBinding(((EnumDeclaration) node).resolveBinding()); - } else if (node instanceof AnnotationTypeDeclaration) { + } + else if (node instanceof AnnotationTypeDeclaration) { return resolveBinding(((AnnotationTypeDeclaration) node).resolveBinding()); - } else if (node instanceof AnnotationTypeMemberDeclaration) { + } + else if (node instanceof AnnotationTypeMemberDeclaration) { return resolveBinding(((AnnotationTypeMemberDeclaration) node).resolveBinding()); - } else if (node instanceof AnonymousClassDeclaration) { + } + else if (node instanceof AnonymousClassDeclaration) { return resolveBinding(((AnonymousClassDeclaration) node).resolveBinding()); - } else if (node instanceof EnumConstantDeclaration) { + } + else if (node instanceof EnumConstantDeclaration) { return resolveBinding(((EnumConstantDeclaration) node).resolveVariable()); - } else if (node instanceof ClassInstanceCreation) { + } + else if (node instanceof ClassInstanceCreation) { return resolveBinding(((ClassInstanceCreation) node).resolveConstructorBinding()); - } else if (node instanceof FieldAccess) { + } + else if (node instanceof FieldAccess) { return resolveFieldAccess((FieldAccess) node); - } else if (node instanceof MethodInvocation) { + } + else if (node instanceof MethodInvocation) { return resolveBinding(((MethodInvocation) node).resolveMethodBinding()); - } else if (node instanceof QualifiedName) { + } + else if (node instanceof QualifiedName) { return resolveQualifiedName((QualifiedName) node); - } else if (node instanceof SimpleName) { + } + else if (node instanceof SimpleName) { return resolveSimpleName(node, tryHard); - } else if (node instanceof SuperFieldAccess) { + } + else if (node instanceof SuperFieldAccess) { return resolveBinding(((SuperFieldAccess) node).resolveFieldBinding()); - } else if (node instanceof SuperMethodInvocation) { + } + else if (node instanceof SuperMethodInvocation) { return resolveBinding(((SuperMethodInvocation) node).resolveMethodBinding()); - } else if (node instanceof MemberRef) { + } + else if (node instanceof MemberRef) { return resolveBinding(((MemberRef) node).resolveBinding()); - } else if (node instanceof MethodDeclaration) { + } + else if (node instanceof MethodDeclaration) { return resolveBinding(((MethodDeclaration) node).resolveBinding()); - } else if (node instanceof MethodRef) { + } + else if (node instanceof MethodRef) { return resolveBinding(((MethodRef) node).resolveBinding()); - } else if (node instanceof PackageDeclaration) { + } + else if (node instanceof PackageDeclaration) { return resolveBinding(((PackageDeclaration) node).resolveBinding()); - } else if (node instanceof Type) { + } + else if (node instanceof Type) { return resolveBinding(((Type) node).resolveBinding()); - } else if (node instanceof TypeParameter) { + } + else if (node instanceof TypeParameter) { return resolveBinding(((TypeParameter) node).resolveBinding()); - } else if (node instanceof VariableDeclaration) { + } + else if (node instanceof VariableDeclaration) { return resolveVariable(node); - } else if (node instanceof ConstructorInvocation) { + } + else if (node instanceof ConstructorInvocation) { return resolveBinding(((ConstructorInvocation) node).resolveConstructorBinding()); - } else if (node instanceof SuperConstructorInvocation) { + } + else if (node instanceof SuperConstructorInvocation) { return resolveBinding(((SuperConstructorInvocation) node).resolveConstructorBinding()); - } else if (node instanceof TypeDeclarationStatement) { + } + else if (node instanceof TypeDeclarationStatement) { return resolveBinding(((TypeDeclarationStatement) node).resolveBinding()); - } else if (node instanceof Initializer) { + } + else if (node instanceof Initializer) { return resolveInitializer((Initializer) node); } } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index ce80113fa7f..0a56e6be1ec 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -23,6 +23,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.IModuleBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.rascalmpl.values.ValueFactoryFactory; @@ -152,6 +153,7 @@ protected ISourceLocation resolveBinding(ASTNode node) { if (node instanceof CompilationUnit) { return resolveBinding((CompilationUnit) node); } + return bindingsResolver.resolveBinding(node, true); } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java index 0cd2cdd6469..c9a005f3400 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java @@ -191,7 +191,7 @@ public boolean visit(CompilationUnit node) { @Override public boolean visit(ModuleDeclaration node) { insert(declarations, ownValue, getSourceLocation(node)); - scopeManager.push(getSourceLocation(node)); + scopeManager.push((ISourceLocation) ownValue); return true; } From 01365e28d3911b744e3b5feff5850cc2edfd0711 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Fri, 26 Apr 2024 13:38:28 +0200 Subject: [PATCH 086/134] solved several detailed issues in JarConverter --- .../java/m3/internal/ASMNodeResolver.java | 27 ++++++++++---- .../lang/java/m3/internal/JarConverter.java | 35 ++++++++++++++----- .../m3/internal/JavaToRascalConverter.java | 1 - .../lang/java/m3/internal/M3Constants.java | 1 + 4 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java index 9f0c4e1cf94..824c16acfa5 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java @@ -12,6 +12,7 @@ */ package org.rascalmpl.library.lang.java.m3.internal; +import static org.rascalmpl.library.lang.java.m3.internal.M3Constants.ARRAY_METHOD_SCHEME; import static org.rascalmpl.library.lang.java.m3.internal.M3Constants.CLASS_SCHEME; import static org.rascalmpl.library.lang.java.m3.internal.M3Constants.COMPILED_CONSTRUCTOR_NAME; import static org.rascalmpl.library.lang.java.m3.internal.M3Constants.COMPILED_STATIC_CONSTRUCTOR_NAME; @@ -347,8 +348,15 @@ private ISourceLocation resolveMethodBinding(String name, String desc, String ty String typeName = ((IString) M3LocationUtil.getLocationName(typePath)).getValue(); String signature = getMethodSignature(name, desc, typeName); String path = typePath + "/" + signature; - - return M3LocationUtil.makeLocation(getMethodScheme(name), "", path); + String methodScheme = getMethodScheme(name, typeName); + + if (methodScheme.equals(ARRAY_METHOD_SCHEME)) { + // the array type is not consequential since we only have the Object methods in Array (hashCode, equals, clone). + return M3LocationUtil.makeLocation(methodScheme, "", getMethodScheme(name, "java.lang.Object")); + } + else { + return M3LocationUtil.makeLocation(methodScheme, "", path); + } } /** @@ -394,10 +402,17 @@ private String createStaticInitializerName(String typeName) { * @param name - method name * @return method's scheme */ - private String getMethodScheme(String name) { - return (name.equals(COMPILED_CONSTRUCTOR_NAME)) ? CONSTRUCTOR_SCHEME - : (name.equals(COMPILED_STATIC_CONSTRUCTOR_NAME)) ? INITIALIZER_SCHEME - : METHOD_SCHEME; + private String getMethodScheme(String name, String typeName) { + switch(name) { + case COMPILED_CONSTRUCTOR_NAME : return CONSTRUCTOR_SCHEME; + case COMPILED_STATIC_CONSTRUCTOR_NAME: return INITIALIZER_SCHEME; + } + + if (typeName.endsWith("[]")) { + return ARRAY_METHOD_SCHEME; + } + + return METHOD_SCHEME; } /** diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index cda18932700..bee3b1dea4d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -58,7 +58,7 @@ public class JarConverter extends M3Converter { /** * Physical source location of the current compilation unit. - * A .class file is considered as a computational unit. + * A .class file is considered as a compilation unit. */ private ISourceLocation compUnitPhysical; @@ -78,11 +78,6 @@ public class JarConverter extends M3Converter { */ private URIResolverRegistry registry; - - //--------------------------------------------- - // Methods - //--------------------------------------------- - /** * JarConverter constructor * @param typeStore @@ -112,6 +107,7 @@ private void initializeModifiers() { modifiersOpcodes.put(Opcodes.ACC_SYNCHRONIZED, constructModifierNode("synchronized")); modifiersOpcodes.put(Opcodes.ACC_TRANSIENT, constructModifierNode("transient")); modifiersOpcodes.put(Opcodes.ACC_VOLATILE, constructModifierNode("volatile")); + modifiersOpcodes.put(Opcodes.ACC_TRANSITIVE, constructModifierNode("transitive")); } /** @@ -408,7 +404,17 @@ private void setMethodOverridesRelation(String superClass, MethodNode methodNode if (superMethods != null) { for (MethodNode superMethodNode : superMethods) { - // TODO: equals is to strict, methods can be overridden even if the parameters have different types. + + if ((superMethodNode.access & Opcodes.ACC_STATIC) != 0) { + // static methods do not override + continue; + } + + if ((superMethodNode.access & Opcodes.ACC_FINAL) != 0) { + // final methods can not be overriden + continue; + } + if (superMethodNode.name.equals(methodNode.name) && superMethodNode.desc.equals(methodNode.desc)) { @@ -418,6 +424,17 @@ private void setMethodOverridesRelation(String superClass, MethodNode methodNode insert(methodOverrides, methodLogical, methodSuperLogical); addToMethodOverrides(classNode, methodNode, methodLogical); } + else if (superMethodNode.name.equals(methodNode.name)) { + // if the parameters and the name are the same, we can have co-variant return types (non-primitive) + if (Type.getArgumentTypes(superMethodNode.desc).equals(Type.getArgumentTypes(methodNode.desc))) { + // so here we assume the code was generated by a correct Java compiler + ISourceLocation superClassLogical = resolver.resolveBinding(classNode, null); + ISourceLocation methodSuperLogical = resolver.resolveBinding(superMethodNode, superClassLogical); + + insert(methodOverrides, methodLogical, methodSuperLogical); + addToMethodOverrides(classNode, methodNode, methodLogical); + } + } } } } @@ -470,7 +487,7 @@ private void setParameterRelations(MethodNode methodNode, ISourceLocation method private void setInstructionRelations(MethodNode methodNode, ISourceLocation methodLogical) { InsnList instructions = methodNode.instructions; - if(instructions != null) { + if (instructions != null) { ListIterator iterator = instructions.iterator(); while (iterator.hasNext()) { @@ -500,6 +517,8 @@ else if (node instanceof TypeInsnNode) { */ private void setInstructionRelations(MethodNode methodNode, ISourceLocation methodLogical, MethodInsnNode instructionNode) { ISourceLocation methodInvocationLogical = resolver.resolveBinding(instructionNode, methodLogical); + + addToMethodInvocation(methodLogical, methodInvocationLogical); // The class of the current method may also have a dependency on the same type. addToTypeDependency(methodLogical, Type.getObjectType(instructionNode.owner)); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 0a56e6be1ec..0d50539e488 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -23,7 +23,6 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; -import org.eclipse.jdt.core.dom.IModuleBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.rascalmpl.values.ValueFactoryFactory; diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Constants.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Constants.java index 9bdcf2078f4..fe4cb36e0af 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Constants.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Constants.java @@ -27,6 +27,7 @@ public final class M3Constants { public final static String INITIALIZER_SCHEME = "java+initializer"; public final static String INTERFACE_SCHEME = "java+interface"; public final static String METHOD_SCHEME = "java+method"; + public final static String ARRAY_METHOD_SCHEME = "java+arrayMethod"; public final static String PACKAGE_SCHEME = "java+package"; public final static String PARAMETER_SCHEME = "java+parameter"; public final static String PRIMITIVE_TYPE_SCHEME = "java+primitiveType"; From b9fde2e745fe05a7408540b5e3bd6c258f8d15d8 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 12:47:58 +0200 Subject: [PATCH 087/134] added Java 9 module extraction to the Jar converter, also aligned with the source converter and renamed some relations --- .../java/m3/internal/ASMNodeResolver.java | 13 ++++ .../java/m3/internal/BindingsResolver.java | 4 +- .../lang/java/m3/internal/JarConverter.java | 76 +++++++++++++++++++ .../m3/internal/JavaToRascalConverter.java | 5 ++ .../lang/java/m3/internal/M3Converter.java | 18 ++--- .../java/m3/internal/SourceConverter.java | 8 +- 6 files changed, 109 insertions(+), 15 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java index 824c16acfa5..a69dd601d08 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASMNodeResolver.java @@ -45,6 +45,7 @@ import org.objectweb.asm.tree.FieldNode; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.ModuleNode; import org.objectweb.asm.tree.ParameterNode; import org.rascalmpl.uri.URIResolverRegistry; import org.rascalmpl.uri.URIUtil; @@ -223,6 +224,9 @@ else if (node instanceof ParameterNode) { else if (node instanceof ClassNode) { return resolveBinding((ClassNode) node); } + else if (node instanceof ModuleNode) { + return resolveBinding((ModuleNode) node); + } // FieldInsNode represents a field loading or storing instruction. else if (node instanceof FieldInsnNode) { return resolveBinding((FieldInsnNode) node); @@ -268,6 +272,15 @@ private ISourceLocation resolveBinding(ClassNode node) { return M3LocationUtil.makeLocation(resolveClassScheme(node), "", node.name); } + /** + * Returns the location of a module node. + * @param node - module node + * @return logical location + */ + private ISourceLocation resolveBinding(ModuleNode node) { + return M3LocationUtil.makeLocation("java+module", "", node.name); + } + /** * Returns the location of a field store/access node. * @param node - field instruction node diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java b/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java index ed4894a220a..f142b529dfb 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/BindingsResolver.java @@ -268,7 +268,7 @@ private ISourceLocation resolveInitializer(Initializer node) { initializerLookUp.put(node, result); return result; } - + public ISourceLocation resolveBinding(IBinding binding) { if (binding == null) { return makeBinding("unresolved", null, null); @@ -618,7 +618,7 @@ else if (binding.getDeclaringClass() != null) { } if (binding.isWildcardType()) { - return makeBinding("unknown", null, null); + return makeBinding("java+wildcardType", null, null); } if (binding.isLocal()) { diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index bee3b1dea4d..ee956de623e 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -41,6 +41,8 @@ import org.objectweb.asm.tree.InsnList; import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; +import org.objectweb.asm.tree.ModuleNode; +import org.objectweb.asm.tree.ModuleOpenNode; import org.objectweb.asm.tree.TypeInsnNode; import org.rascalmpl.interpreter.utils.RascalManifest; import org.rascalmpl.uri.URIResolverRegistry; @@ -248,6 +250,17 @@ private ISourceLocation createParentPackageLogicalLoc(String relativePath) { return M3LocationUtil.makeLocation(PACKAGE_SCHEME, "", path); } + private ISourceLocation resolveInternalTypeName(String name) { + ClassReader classReader = resolver.buildClassReader(name); + + if (classReader != null) { + ClassNode classNode = new ClassNode(); + classReader.accept(classNode, ClassReader.SKIP_DEBUG); + return resolver.resolveBinding(classNode, null); + } + + return bindingsResolver.makeBinding("java+classOrInterface", name, name); + } /** * Sets class M3 relations. The creation of relations associated * to inner classes, fields, and methods is triggered. @@ -259,6 +272,12 @@ private void setClassRelations(ClassReader classReader, String compUnitRelative) ClassNode classNode = new ClassNode(); classReader.accept(classNode, ClassReader.SKIP_DEBUG); + if (classNode.module != null) { + addModuleRelations(classNode.module); + // TODO: check if this is ok; we are skipping everything else here! + return; + } + IString className = M3LocationUtil.getLocationName(classNode.name); ISourceLocation compUnitLogical = M3LocationUtil.makeLocation(COMP_UNIT_SCHEME, "", compUnitRelative); @@ -283,6 +302,63 @@ private void setClassRelations(ClassReader classReader, String compUnitRelative) } } + private void addModuleRelations(ModuleNode module) { + ISourceLocation modLoc = resolveBinding(module); + String version = module.version; + addToDeclarations(modLoc, compUnitPhysical); + + // TODO: what to do about the respective module _versions_? + + for (var export : module.exports) { + var pkgLoc = resolveBinding(export.packaze); + + if (export.modules.isEmpty()) { + // export to all + insert(moduleExportsPackage, pkgLoc, URIUtil.rootLocation("java+module")); + } + else { + // export to specific modules + for (var to : export.modules) { + insert(moduleExportsPackage, modLoc, pkgLoc, M3LocationUtil.makeLocation("java+module", "", to)); + } + } + } + + for (var provides : module.provides) { + var service = resolveInternalTypeName(provides.service); + for (var to : provides.providers) { + insert(moduleProvidesService, modLoc, service, resolveInternalTypeName(to)); + } + } + + for (var uses : module.uses) { + var service = resolveInternalTypeName(uses); + insert(moduleProvidesService, modLoc, service); + } + + for (var requires : module.requires) { + var required = M3LocationUtil.makeLocation("java+module", "", requires.module) + insert(moduleRequiresModule, modLoc, required); + } + + for (ModuleOpenNode opens : module.opens) { + var pkg = resolveBinding(opens.packaze); + + if (opens.modules.isEmpty()) { + // open to all + insert(moduleOpensPackage, pkg, URIUtil.rootLocation("java+module")); + } + else { + // open to specific + for (var to : opens.modules) { + insert(moduleOpensPackage, modLoc, pkg, resolveInternalTypeName(to)); + } + } + } + + return; + } + /** * Sets M3 relations of all inner classes of a given class node. * @param classNode - parent class node where inner classes are declared diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java index 0d50539e488..fa7f03ca5b2 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JavaToRascalConverter.java @@ -25,6 +25,7 @@ import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; +import org.objectweb.asm.tree.ModuleNode; import org.rascalmpl.values.ValueFactoryFactory; import io.usethesource.vallang.IConstructor; @@ -156,6 +157,10 @@ protected ISourceLocation resolveBinding(ASTNode node) { return bindingsResolver.resolveBinding(node, true); } + protected ISourceLocation resolveBinding(ModuleNode module) { + return bindingsResolver.makeBinding("java+module", "", ((ModuleNode) module).name); + } + protected ISourceLocation getSourceLocation(ASTNode node) { try { int nodeLength = compilUnit.getExtendedLength(node); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index d15e4f5e0d1..4edf70d4b96 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -33,10 +33,10 @@ public abstract class M3Converter extends JavaToRascalConverter { protected ISetWriter types; protected ISetWriter annotations; protected ISetWriter moduleOpensPackage; - protected ISetWriter moduleProvidesImplementation; + protected ISetWriter moduleProvidesService; protected ISetWriter moduleRequiresModule; - protected ISetWriter moduleUsesInterface; - protected ISetWriter moduleExportsInterface; + protected ISetWriter moduleUsesService; + protected ISetWriter moduleExportsPackage; protected final io.usethesource.vallang.type.Type CONSTRUCTOR_M3; protected final Type JAVA_LANGUAGE_M3; @@ -71,10 +71,10 @@ public abstract class M3Converter extends JavaToRascalConverter { types = values.setWriter(); languages = values.setWriter(); moduleOpensPackage = values.setWriter(); - moduleProvidesImplementation = values.setWriter(); + moduleProvidesService = values.setWriter(); moduleRequiresModule = values.setWriter(); - moduleUsesInterface = values.setWriter(); - moduleExportsInterface = values.setWriter(); + moduleUsesService = values.setWriter(); + moduleExportsPackage = values.setWriter(); } public IValue getModel(boolean insertErrors) { @@ -95,10 +95,10 @@ public IValue getModel(boolean insertErrors) { setKeywordParameter("methodOverrides", methodOverrides.done()); setKeywordParameter("types", types.done()); setKeywordParameter("moduleOpensPackage", moduleOpensPackage.done()); - setKeywordParameter("moduleProvidesImplementation", moduleProvidesImplementation.done()); + setKeywordParameter("moduleProvidesService", moduleProvidesService.done()); setKeywordParameter("moduleRequiresModule", moduleRequiresModule.done()); - setKeywordParameter("moduleUsesInterface", moduleUsesInterface.done()); - setKeywordParameter("moduleExportsInterface", moduleExportsInterface.done()); + setKeywordParameter("moduleUsesInterface", moduleUsesService.done()); + setKeywordParameter("moduleExportsInterface", moduleExportsPackage.done()); insertCompilationUnitMessages(insertErrors, messages.done()); diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java index c9a005f3400..5e9d2315498 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/SourceConverter.java @@ -220,11 +220,11 @@ public boolean visit(ExportsDirective node) { if (targets.isEmpty()) { // this encodes unqualified exports to all other modules - insert(moduleExportsInterface, parent, name, URIUtil.rootLocation("java+module")); + insert(moduleExportsPackage, parent, name, URIUtil.rootLocation("java+module")); } else { for (var target : targets) { - insert(moduleExportsInterface, parent, name , target); + insert(moduleExportsPackage, parent, name , target); } } @@ -241,7 +241,7 @@ public boolean visit(ProvidesDirective node) { var name = resolveBinding(node.getName()); for (var impl : implementations) { - insert(moduleProvidesImplementation, parent, name, impl); + insert(moduleProvidesService, parent, name, impl); } return true; @@ -250,7 +250,7 @@ public boolean visit(ProvidesDirective node) { @Override public boolean visit(UsesDirective node) { var parent = scopeManager.peek(); - insert(moduleUsesInterface, parent, resolveBinding(node.getName())); + insert(moduleUsesService, parent, resolveBinding(node.getName())); return true; } From c114650b039697b1000802e88dcedef9cebb0e10 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 12:48:30 +0200 Subject: [PATCH 088/134] commented out mergeKeywordParameters function for bootstrpping purposes --- src/org/rascalmpl/library/Node.rsc | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/org/rascalmpl/library/Node.rsc b/src/org/rascalmpl/library/Node.rsc index 53ad3dac255..d05dd36d233 100644 --- a/src/org/rascalmpl/library/Node.rsc +++ b/src/org/rascalmpl/library/Node.rsc @@ -65,15 +65,16 @@ setKeywordParameters("f"(10, "abc"), ("height":0)); @javaClass{org.rascalmpl.library.Prelude} public java &T <: node setKeywordParameters(&T <: node x, map[str,value] keywordParameters); -@synopsis{Adds new keyword parameters to a node, keeping the existing ones unless there is an entry in the new map.} -@examples{ -```rascal-shell -import Node; -mergeKeywordParameters("f"(10, "abc", width=10), ("height":0)); -``` -} -@javaClass{org.rascalmpl.library.Prelude} -public java &T <: node mergeKeywordParameters(&T <: node x, map[str,value] keywordParameters); +// @synopsis{Adds new keyword parameters to a node, keeping the existing ones unless there is an entry in the new map.} +// @examples{ +// ```rascal-shell +// import Node; +// mergeKeywordParameters("f"(10, "abc", width=10), ("height":0)); +// ``` +// } +// @javaClass{org.rascalmpl.library.Prelude} +// TODO: uncomment after bootstrap +// public java &T <: node mergeKeywordParameters(&T <: node x, map[str,value] keywordParameters); @deprecated{ From 359e04657b49acc74f8abcb1a3548ab44692cc2d Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 12:48:50 +0200 Subject: [PATCH 089/134] improved documentation of Java m3 --- .../rascalmpl/library/analysis/m3/Core.rsc | 2 +- .../rascalmpl/library/lang/java/m3/AST.rsc | 16 ++-- .../rascalmpl/library/lang/java/m3/Core.rsc | 88 ++++++++++++++++--- 3 files changed, 85 insertions(+), 21 deletions(-) diff --git a/src/org/rascalmpl/library/analysis/m3/Core.rsc b/src/org/rascalmpl/library/analysis/m3/Core.rsc index 62b107a367e..5ef4835dd65 100644 --- a/src/org/rascalmpl/library/analysis/m3/Core.rsc +++ b/src/org/rascalmpl/library/analysis/m3/Core.rsc @@ -88,7 +88,7 @@ function implements such a union. * Composition can be used to easily construct project-level models from file-level models. * Composition can be used to simulate (dynamic) linkage between projects. * Composition can be used to start simulating remote-procedure calls and shared memory, and other inter-programming language composition like _JNI_. -* M3 models can be cached (efficiently) on disk using functions from ((util::ValueIO)). A single stored M3 model simulates an _object file_, +* M3 models can be cached (efficiently) on disk using functions from ((ValueIO)). A single stored M3 model simulates an _object file_, while a composed M3 model is more like an `.a` archive or a `.jar` archive. * Integrating M3 model caching during a build process (e.g ANT, Makefiles or Maven) is a smart way to make whole program analysis fast and incremental. * Integrating M3 model caching in Integrated Development Environments (e.g. the Language Server Protocol) enables fast and incremental IDE features based on whole program indexing that M3 provides. diff --git a/src/org/rascalmpl/library/lang/java/m3/AST.rsc b/src/org/rascalmpl/library/lang/java/m3/AST.rsc index 08952ab5a60..c427c772edf 100644 --- a/src/org/rascalmpl/library/lang/java/m3/AST.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/AST.rsc @@ -237,17 +237,17 @@ data Statement @synopsis{These are the literal types you can find in Java programs.} @description{ -* The constructors of Type represent the syntax of types in Java. -* Their `typ` keyword field maps the syntax to the symbolic type representation as ((TypeSymbol))s. +* The constructors of ((lang::java::m3::AST::Type)) represent the syntax of types in Java. +* Their `typ` keyword field maps the syntax to the symbolic type representation as ((lang::java::m3::TypeSymbol::TypeSymbol))s. } @pitfalls{ -* ((Type)) and ((TypeSymbol)) are easy to confuse because they are very similar in name, structure and intent. It is good to remember -that there can be more TypeSymbols while analyzing types for Java than one can type in. Namely, ((TypeSymbol)) is used to -compute with and analyze the Java type system, while ((Type)) is only meant to represent the syntax of types in Java source code. -* ((Type)) closely follows the syntactic structure, while ((TypeSymbol)) follows the logical structure. +* ((lang::java::m3::AST::Type)) and ((lang::java::m3::TypeSymbol::TypeSymbol)) are easy to confuse because they are very similar in name, structure and intent. It is good to remember +that there can be more TypeSymbols while analyzing types for Java than one can type in. Namely, ((lang::java::m3::TypeSymbol::TypeSymbol)) is used to +compute with and analyze the Java type system, while ((lang::java::m3::AST::Type)) is only meant to represent the syntax of types in Java source code. +* ((lang::java::m3::AST::Type)) closely follows the syntactic structure, while ((lang::java::m3::TypeSymbol::TypeSymbol)) follows the logical structure. For example: `Node[]` in Java syntax becomes `arrayType(parameterizedType(simpleType(id("Node")),[simpleType(id("Cons"))]))` as -an abstract syntax tree ((Type)), which becomes this ((TypeSymbol)): `array(class(|class:///Node|,[interface(|interface:///Cons|,[])]),1))` -* ((TypeSymbol)) reduces different ways of writing types to one core canonical +an abstract syntax tree ((lang::java::m3::AST::Type)), which becomes this ((lang::java::m3::TypeSymbol::TypeSymbol)): `array(class(|class:///Node|,[interface(|interface:///Cons|,[])]),1))` +* ((lang::java::m3::TypeSymbol::TypeSymbol)) reduces different ways of writing types to one core canonical } data Type(TypeSymbol typ=unresolved()) = arrayType(Type \type) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index e0732795b81..443d21f6eb0 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -40,9 +40,67 @@ requires an additional analysis step with its own design choices. | `rel[loc from, loc to] annotations` | logs which declarations (classes, interfaces, parameters, methods, variables, etc.) are tagged with which annotation classes or interfaces | These are the kinds of logical names that can be found in a Java M3 model: -* `|java+class:///|` is a fully resolved and qualified class name -* `|java+interface:///|` is a fully resolved and qualified class name -* (((TODO))) +* `unknown:///` is from general M3 and means a name has not even been tried to be resolved. It usually the default for the keyword parameters `decl` and `typ`. +* `unresolved:///` is from general M3 and means a name was tried to be resolved, but this was unsuccessful. Typically this means either the Java source code was statically incorrect, or the _classpath_ for configuring AST or M3 extraction was incomplete. +* `java+class:///` is a fully resolved and qualified class name +* `java+interface:///` is a fully resolved and qualified class name +* `java+classOrInterface:///` is the fully qualified name of an external class or interface that has not been resolved (since it is not on the classpath but it is used). +* `java+module:///` the root scheme points to _any or all_ modules and when it has a qualified name it is a specific module (a la Java 9's module system). +* `java+compilationUnit:///` +* `java+constructor:///` is the fully qualified constructor method of class (including parameter types to distinguish it from the other constructors) +* `java+method:///` is the fully qualified constructor method of class (including parameter types to distinguish it from the other constructors) +* `java+initializer:///` unique address of an initializer expression for a field or variable. +* `java+parameter:///` unique address for method, constructor and lambda parameters. +* `java+variable:///` unique address for local variables in methods, constructors and lambdas. +* `java+field:///` unique address for fields of classes and interfaces. +* `java+enum:///` is a fully resolved and qualified name of an enum class. +* `java+array:///` is the name of an array type +* `java+typeVariable:///` is the unique address of an open type variable (of a class or method) +* `java+wildcardType:///` is the address of an anonymous type variable. +* `java+enumConstant:///` is the unique address of one of the constants of an `enum` type. +* `java+field:///` is the unique address of a field in a class, interface or enum. +* `java+arrayLength:///` is the singleton address for the length field of all arrays in Java. +* `java+primitiveType:///` is used when type resolution points to a builtin primitive in Java. These names also often occur +* `java+anonymousClass:///` uniquely labels anonymous classes, however since indexing is used the names are not stable between different versions of the same code, or between binary and source extractions. +as elements of other schemes, for example to uniquel encode parameter types of methods. +} +@benefits{ +* Java M3 is an _immutable_ database, which is implemented using advanced persistent hash-tries under the hood. This makes analysis fast, +and if you compute new M3 models from earlier models your source data can never be influenced by the later stages. This is very good +for research purposes where the provenance of every data point is essential for the sake of validity. +* Java M3 is complete in the sense that all notions of programmable artefacts that exist in Java are represented. If the M3 database does not +provide enough information, then the AST model is the next source to use. +* Java M3 is aligned with the AST model for Java: + * every `decl=` parameter on Declarations nodes corresponds to an entry in the `declarations` relation in M3 + * every `decl=` parameter on other nodes (Expressions, Types, Statements), corresponds to an entry in the `uses` relation in M3. + * every `src` parameter on AST nodes can be looked up in the `declarations` or `uses` relations. Although not all nodes lead to +declarations or uses of declarations, if they do their source locations line up between the AST and the M3 model. + * The `typ` parameters on nodes is a distributed version of the generic `types` relation in de M3 model. + * scope nesting in the AST is represented one-to-one by the `containment` relation in the M3 model. + * The `modifiers` relation in M3 collects all the modifiers for every Declaration node that may have modifiers in Java. +* Java M3 is freely composable using the ((composeM3)) function, to create larger databases of measurable and analyzable software artefacts. +* Java M3 has been used in countless education and research projects. +* Java M3 can be composed with M3 models of other languages (C++, C) for cross language analysis. +* Java M3 represents only exact and accurate facts, and no analysis results (yet). You can write a simple call graph analysis +in one line of Rascal; but it is good to realize that such analyses are inaccurate by their very nature. +* Java M3 has all the basic facts to build basic and advanced static analyses (such as call graphs) +* Using ((diffJavaM3)) software evolution can be tracked over syntactic and semantic objects, instead of just line of text. +* M3 models can be extracted from source code, but also from .class files in jars and folders. +} +@pitfalls{ +* with `|unresolved:///|`'s or `unknown:///`'s in the model, counting elements for the sake of software metrics is dubious. The reason +is that the counts will simply be off (both over- and under-approximated). Typically it is better to iterate a better _classpath_ +until the list of error `messages` from the compiler is empty and all names and types have been resolved, and then start measuring +or running downstream analyses. +* Composition via ((composeM3)) is _dumb_; it simply unions all the sets of tuples. For a meaningful link, there are specific +analyses to run. +* Models extracted for the _same project_ from source or from .class files can be slightly different: + * If _classpath_ parameters were different between the different extractors, then names and types can be resolved differently or not at all. + * Some artefacts on the source code level are compiled away on the bytecode level (lambdas are a fine example). If you need to line up +facts from source and binary, an additional analysis is required using heuristics that "decompile" JVM bytecode back to the Java level. + * Anonymous entities such as lambdas and anonymous nested classes may be labeled by a different counter, accidentally. +* The intersection of the generic `modifiers` relation in M3 and the Java-specific `annotations` is not empty. All annotations +are also modifiers in Java M3, but no non-annotation modifiers end up in the `annotations`` relation. } data M3( rel[loc from, loc to] extends = {}, @@ -68,11 +126,12 @@ definition explains: And so each of these aspects has their own set of facts in the extended M3 model for Java: | Facts about Java modules | Description | | ---------------------------------------------------- | ------------------------------------------------------- | -| `rel[loc \module, loc package, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | -| `rel[loc \module, loc service, loc implementation] moduleProvidesImplementation` | what services are implemented by this module | | `rel[loc \module, loc requiredModule] moduleRequiresModule` | which modules each module requires | -| `rel[loc \module, loc service] moduleUsesInterface` | which services are used by every module | -| `rel[loc \module, loc service, loc to] moduleExportsInterface` | which interfaces are exported by every module | +| `rel[loc \module, loc package, loc to] moduleOpensPackage` | what packages are open for reflection in a given module | +| `rel[loc \module, loc service, loc to] moduleExportsPackage` | which packages (the public and protected classes therein) are exported by every module | +| `rel[loc \module, loc service, loc implementation] moduleProvidesService` | what services are implemented by this module | +| `rel[loc \module, loc service] moduleUsesService` | which services are used by every module | + } @benefits{ * M3 models with the Module system extensions are composable to generate large queriable databases for entire software ecosystems. @@ -82,13 +141,18 @@ And so each of these aspects has their own set of facts in the extended M3 model * modules, although they semantically encapsulate packages, interfaces and classes, do not appear in the `containment` relation of the core M3 model. That is because `containment` represents the static scoping relation of declared source code elements. The relation between modules and what is inside them is yet another form of encapsulation; so to avoid conflating them they are stored in different relations. +* modules information extracted from .class files in jars can be different from the information extracted from source. The matching +cause of this is a different `classpath` at M3-model-extraction-time. Some classes or interfaces from external projects may be +resolved as `java+classOrInterface:///examplePackage/exampleClassOrInterface` in the one, while the exact type is visible as +`java+interface:///examplePackage/exampleClassOrInterface` in the other. After linking all available models using ((composeM3)) you could write a simple analysis +that resolves the unresolved references, or perhaps this information is not consequential to your analysis task. } data M3( - rel[loc \module, loc package, loc to] moduleOpensPackage = {}, - rel[loc \module, loc service, loc implementation] moduleProvidesImplementation = {}, rel[loc \module, loc requiredModule] moduleRequiresModule = {}, - rel[loc \module, loc service] moduleUsesInterface = {}, - rel[loc \module, loc service, loc to] moduleExportsInterface = {} + rel[loc \module, loc package, loc to] moduleOpensPackage = {}, + rel[loc \module, loc service, loc to] moduleExportsPackage = {}, + rel[loc \module, loc service, loc implementation] moduleProvidesService = {}, + rel[loc \module, loc service] moduleUsesService = {} ); @synopsis{Combines a set of Java meta models by merging their relations.} @@ -243,7 +307,7 @@ M3 createM3FromJar(loc jarFile, list[loc] classPath = []) { } void unregisterJavaProject(loc project) { - unregisterProjectSchemes(project, {"java+compilationUnit", "java+compilationUnit", "java+class", "java+constructor", "java+initializer", "java+parameter","java+variable","java+field" , "java+interface" , "java+enum", "java+class" , "java+interface","java+enum"}); + unregisterProjectSchemes(project, {"java+compilationUnit", "java+compilationUnit", "java+class", "java+constructor", "java+initializer", "java+parameter","java+variable","java+field" , "java+interface" , "java+enum", "java+class" , "java+interface","java+enum","java+module"}); } @deprecated{ From 7e0eeae1cc25d2adebc292217aa5666c00417552 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 13:00:39 +0200 Subject: [PATCH 090/134] improved docs --- src/org/rascalmpl/library/lang/java/m3/Core.rsc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 443d21f6eb0..1d67c4ccf35 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -43,10 +43,10 @@ These are the kinds of logical names that can be found in a Java M3 model: * `unknown:///` is from general M3 and means a name has not even been tried to be resolved. It usually the default for the keyword parameters `decl` and `typ`. * `unresolved:///` is from general M3 and means a name was tried to be resolved, but this was unsuccessful. Typically this means either the Java source code was statically incorrect, or the _classpath_ for configuring AST or M3 extraction was incomplete. * `java+class:///` is a fully resolved and qualified class name -* `java+interface:///` is a fully resolved and qualified class name +* `java+interface:///` is a fully resolved and qualified interface name * `java+classOrInterface:///` is the fully qualified name of an external class or interface that has not been resolved (since it is not on the classpath but it is used). * `java+module:///` the root scheme points to _any or all_ modules and when it has a qualified name it is a specific module (a la Java 9's module system). -* `java+compilationUnit:///` +* `java+compilationUnit:///` is the name of a file that contains an entire Java compilationUnit. The path name starts from the root of the source path for the current analysis run, or from the jar file that contains the .class bytecode currently under analysis. Typically a source compilation unit has one class member in the `containment` relation, but this is not required. There could be more private or protected classes in the same unit. * `java+constructor:///` is the fully qualified constructor method of class (including parameter types to distinguish it from the other constructors) * `java+method:///` is the fully qualified constructor method of class (including parameter types to distinguish it from the other constructors) * `java+initializer:///` unique address of an initializer expression for a field or variable. @@ -68,8 +68,7 @@ as elements of other schemes, for example to uniquel encode parameter types of m * Java M3 is an _immutable_ database, which is implemented using advanced persistent hash-tries under the hood. This makes analysis fast, and if you compute new M3 models from earlier models your source data can never be influenced by the later stages. This is very good for research purposes where the provenance of every data point is essential for the sake of validity. -* Java M3 is complete in the sense that all notions of programmable artefacts that exist in Java are represented. If the M3 database does not -provide enough information, then the AST model is the next source to use. +* Java M3 is complete in the sense that all notions of programmable artefacts that exist in Java are represented. However, every piece of information is local and static: intra-procedural, flow and path insensitive. If the M3 database does not provide enough information, then the AST model is the next source to use. There is also a flow analysis module: ((JavaToObjectFlow)). * Java M3 is aligned with the AST model for Java: * every `decl=` parameter on Declarations nodes corresponds to an entry in the `declarations` relation in M3 * every `decl=` parameter on other nodes (Expressions, Types, Statements), corresponds to an entry in the `uses` relation in M3. From 90efee41b54d90f8c924b891266e6cdcbd608937 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 13:17:04 +0200 Subject: [PATCH 091/134] fixed badmerge --- .../rascalmpl/library/lang/java/m3/internal/ASTConverter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java index a87b078713c..22ed239d99d 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/ASTConverter.java @@ -123,6 +123,7 @@ import org.eclipse.jdt.core.dom.WildcardType; import io.usethesource.vallang.ISourceLocation; +import io.usethesource.vallang.IString; import io.usethesource.vallang.IValue; import io.usethesource.vallang.type.TypeFactory; @@ -936,7 +937,7 @@ public boolean visit(MethodDeclaration node) { IListWriter parameters = values.listWriter(); for (Iterator it = node.parameters().iterator(); it.hasNext();) { SingleVariableDeclaration v = (SingleVariableDeclaration) it.next(); - parameters.add(visitChild(v)); + parameters.insert(visitChild(v)); } IListWriter possibleExceptions = values.listWriter(); From 1133cb639e6c1c8314739ea1eb523bdc0b45d8dd Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 13:18:27 +0200 Subject: [PATCH 092/134] added weirdly missing semicolon --- .../rascalmpl/library/lang/java/m3/internal/JarConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index ee956de623e..c8171c23876 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -337,7 +337,7 @@ private void addModuleRelations(ModuleNode module) { } for (var requires : module.requires) { - var required = M3LocationUtil.makeLocation("java+module", "", requires.module) + var required = M3LocationUtil.makeLocation("java+module", "", requires.module); insert(moduleRequiresModule, modLoc, required); } From 56bfa86b389fc0f67e4f85358bc4be16f210600b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 13:19:02 +0200 Subject: [PATCH 093/134] removed dead code --- .../rascalmpl/library/lang/java/m3/internal/JarConverter.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index c8171c23876..f963c949edf 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -304,11 +304,8 @@ private void setClassRelations(ClassReader classReader, String compUnitRelative) private void addModuleRelations(ModuleNode module) { ISourceLocation modLoc = resolveBinding(module); - String version = module.version; addToDeclarations(modLoc, compUnitPhysical); - // TODO: what to do about the respective module _versions_? - for (var export : module.exports) { var pkgLoc = resolveBinding(export.packaze); From c92e930e4f215c29994699d753513fe6fed37508 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Mon, 29 Apr 2024 13:36:27 +0200 Subject: [PATCH 094/134] parameter type changed --- .../lang/rascal/tests/library/lang/java/m3/BasicM3Tests.rsc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/org/rascalmpl/library/lang/rascal/tests/library/lang/java/m3/BasicM3Tests.rsc b/src/org/rascalmpl/library/lang/rascal/tests/library/lang/java/m3/BasicM3Tests.rsc index 415241318e0..865d3c9ce8c 100644 --- a/src/org/rascalmpl/library/lang/rascal/tests/library/lang/java/m3/BasicM3Tests.rsc +++ b/src/org/rascalmpl/library/lang/rascal/tests/library/lang/java/m3/BasicM3Tests.rsc @@ -63,10 +63,10 @@ public M3 getSnakesM3(loc root) set[Declaration] buildASTs(loc root, list[loc] classPath, list[loc] sourcePath) - = createAstsFromFiles(find(root, "java"), true, sourcePath = sourcePath, classPath = classPath, javaVersion ="1.7"); + = createAstsFromFiles(find(root, "java"), true, sourcePath = sourcePath, classPath = classPath, javaVersion = JSL13()); private M3 buildM3(loc projectName, loc root, list[loc] classPath, list[loc] sourcePath) - = composeJavaM3(projectName, createM3sFromFiles(find(root, "java"),sourcePath = sourcePath, classPath = classPath, javaVersion ="1.7")); + = composeJavaM3(projectName, createM3sFromFiles(find(root, "java"),sourcePath = sourcePath, classPath = classPath, javaVersion = JLS13())); // unpackExampleProject("snakes-and-ladders", get("m3/snakes-and-ladders-project-source.zip")); From cb2ac66fe32700fb577afad4b707ae215cae000b Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Tue, 30 Apr 2024 12:11:07 +0200 Subject: [PATCH 095/134] fixed NPEs in module-info resolution from .class files --- .../rascalmpl/library/lang/java/m3/Core.rsc | 9 ++- .../lang/java/m3/internal/JarConverter.java | 77 +++++++++++-------- .../lang/java/m3/internal/M3Converter.java | 2 +- 3 files changed, 49 insertions(+), 39 deletions(-) diff --git a/src/org/rascalmpl/library/lang/java/m3/Core.rsc b/src/org/rascalmpl/library/lang/java/m3/Core.rsc index 1d67c4ccf35..634ced10f28 100644 --- a/src/org/rascalmpl/library/lang/java/m3/Core.rsc +++ b/src/org/rascalmpl/library/lang/java/m3/Core.rsc @@ -145,13 +145,14 @@ cause of this is a different `classpath` at M3-model-extraction-time. Some class resolved as `java+classOrInterface:///examplePackage/exampleClassOrInterface` in the one, while the exact type is visible as `java+interface:///examplePackage/exampleClassOrInterface` in the other. After linking all available models using ((composeM3)) you could write a simple analysis that resolves the unresolved references, or perhaps this information is not consequential to your analysis task. +* the Java module system does not pertain projects and project dependencies and their versions. } data M3( - rel[loc \module, loc requiredModule] moduleRequiresModule = {}, - rel[loc \module, loc package, loc to] moduleOpensPackage = {}, - rel[loc \module, loc service, loc to] moduleExportsPackage = {}, + rel[loc \module, loc requiredModule] moduleRequiresModule = {}, + rel[loc \module, loc package, loc to] moduleOpensPackage = {}, + rel[loc \module, loc service, loc to] moduleExportsPackage = {}, rel[loc \module, loc service, loc implementation] moduleProvidesService = {}, - rel[loc \module, loc service] moduleUsesService = {} + rel[loc \module, loc service] moduleUsesService = {} ); @synopsis{Combines a set of Java meta models by merging their relations.} diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java index f963c949edf..8a9dfe8bdf8 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/JarConverter.java @@ -137,13 +137,12 @@ public void convertJarFile(ISourceLocation classFile, String className, IList cl * Jar scheme is not supported. */ private void createM3() { - try { - + try { try (JarInputStream jarStream = new JarInputStream(registry.getInputStream(loc))) { JarEntry entry = jarStream.getNextJarEntry(); while (entry != null) { compUnitPhysical = URIUtil.getChildLocation(RascalManifest.jarify(loc), entry.getName() + ".class"); - + if (entry.getName().endsWith(".class")) { String compUnit = getCompilationUnitRelativePath(); ClassReader classReader = resolver.buildClassReader(jarStream); @@ -306,49 +305,59 @@ private void addModuleRelations(ModuleNode module) { ISourceLocation modLoc = resolveBinding(module); addToDeclarations(modLoc, compUnitPhysical); - for (var export : module.exports) { - var pkgLoc = resolveBinding(export.packaze); + if (module.exports != null) { + for (var export : module.exports) { + var pkgLoc = resolveBinding(export.packaze); - if (export.modules.isEmpty()) { - // export to all - insert(moduleExportsPackage, pkgLoc, URIUtil.rootLocation("java+module")); - } - else { - // export to specific modules - for (var to : export.modules) { - insert(moduleExportsPackage, modLoc, pkgLoc, M3LocationUtil.makeLocation("java+module", "", to)); + if (export.modules.isEmpty()) { + // export to all + insert(moduleExportsPackage, modLoc, pkgLoc, URIUtil.rootLocation("java+module")); + } + else { + // export to specific modules + for (var to : export.modules) { + insert(moduleExportsPackage, modLoc, pkgLoc, M3LocationUtil.makeLocation("java+module", "", to)); + } } } } - for (var provides : module.provides) { - var service = resolveInternalTypeName(provides.service); - for (var to : provides.providers) { - insert(moduleProvidesService, modLoc, service, resolveInternalTypeName(to)); + if (module.provides != null) { + for (var provides : module.provides) { + var service = resolveInternalTypeName(provides.service); + for (var to : provides.providers) { + insert(moduleProvidesService, modLoc, service, resolveInternalTypeName(to)); + } } } - for (var uses : module.uses) { - var service = resolveInternalTypeName(uses); - insert(moduleProvidesService, modLoc, service); + if (module.uses != null) { + for (var uses : module.uses) { + var service = resolveInternalTypeName(uses); + insert(moduleProvidesService, modLoc, service); + } } - for (var requires : module.requires) { - var required = M3LocationUtil.makeLocation("java+module", "", requires.module); - insert(moduleRequiresModule, modLoc, required); + if (module.requires != null) { + for (var requires : module.requires) { + var required = M3LocationUtil.makeLocation("java+module", "", requires.module); + insert(moduleRequiresModule, modLoc, required); + } } - for (ModuleOpenNode opens : module.opens) { - var pkg = resolveBinding(opens.packaze); - - if (opens.modules.isEmpty()) { - // open to all - insert(moduleOpensPackage, pkg, URIUtil.rootLocation("java+module")); - } - else { - // open to specific - for (var to : opens.modules) { - insert(moduleOpensPackage, modLoc, pkg, resolveInternalTypeName(to)); + if (module.opens != null) { + for (ModuleOpenNode opens : module.opens) { + var pkg = resolveBinding(opens.packaze); + + if (opens.modules.isEmpty()) { + // open to all + insert(moduleOpensPackage, pkg, URIUtil.rootLocation("java+module")); + } + else { + // open to specific + for (var to : opens.modules) { + insert(moduleOpensPackage, modLoc, pkg, resolveInternalTypeName(to)); + } } } } diff --git a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java index 4edf70d4b96..4b976ce748a 100644 --- a/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java +++ b/src/org/rascalmpl/library/lang/java/m3/internal/M3Converter.java @@ -98,7 +98,7 @@ public IValue getModel(boolean insertErrors) { setKeywordParameter("moduleProvidesService", moduleProvidesService.done()); setKeywordParameter("moduleRequiresModule", moduleRequiresModule.done()); setKeywordParameter("moduleUsesInterface", moduleUsesService.done()); - setKeywordParameter("moduleExportsInterface", moduleExportsPackage.done()); + setKeywordParameter("moduleExportsPackage", moduleExportsPackage.done()); insertCompilationUnitMessages(insertErrors, messages.done()); From 0d22d210fbb67f624c2fff017e1e86a4389f98e7 Mon Sep 17 00:00:00 2001 From: "Jurgen J. Vinju" Date: Thu, 2 May 2024 10:54:15 +0200 Subject: [PATCH 096/134] replaced reference ASTs with new shapes after manual confirmation --- .../rascalmpl/test/data/m3/junit4-asts.bin | Bin 1708040 -> 2407737 bytes .../test/data/m3/snakes-and-ladders-asts.bin | Bin 34145 -> 47072 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/org/rascalmpl/test/data/m3/junit4-asts.bin b/test/org/rascalmpl/test/data/m3/junit4-asts.bin index dbce28534f150f7737317461d3cd6898faef9e67..99fab1b6bb45940926154d4d62efe2ab684bb765 100644 GIT binary patch literal 2407737 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%0A4#i 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�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≠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�j~xb7ProP;p#=U{kBE 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%0D;PxW@=Y1DUq?c575alwJSj=dmviK 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

dL4mk21R^!b$mbCDf5& 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

8N)|zQ+QD)TTC_yJo65MUTP(25IjBIwAgM^( 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

661j3tDf=iUNohfUOUD=`W3{qD z6)R6hCZ(H?M*9WTmr(~W^UlT$D;L)Pb2Zx*_*Hg%3f4;K|Di-qeyERA*_~mzOjq&YGEto@n%TRnZCC;NlSS-KA z)-A|xXoV>S>DWI(_z_yy-(zf=FC-Wgz4cmS^;D%?%tZ^Mmx1ogpHf`UC_wVb%i{ZF zx20|Gm40Tm4~0A=e$AH*aN*UvwX_Dr;{$@OA{6i~;YZP5lIVlOZm(D*0)#5g7LzS6 zT=$=)kPo?w8F$UJm~OF1{Dk#d8qyz{BM|dtP;RM{@gl$?i-coBlYnjq)1~J;-z