From 363c0db7242f44ff7f993514f346fd1b3a694856 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Sat, 10 Jan 2026 19:15:16 +0000 Subject: [PATCH 1/5] Refactor join point conversion to include JavaWeaver instance - Updated FunctionalClassGenerator to accept JavaWeaver as a parameter for method generation. - Modified ActionUtils to pass JavaWeaver instance during code insertion and expression replacement. - Enhanced SelectUtils to utilize JavaWeaver in join point conversions for statements and expressions. - Refactored CtElement2JoinPoint and related converters to support JavaWeaver, ensuring all join point creations are consistent with the new structure. - Adjusted converters for executable, expression, statement, type, and XML node to include JavaWeaver, improving integration and functionality. --- JavaWeaver/.gitignore | 1 + JavaWeaver/src/weaver/kadabra/JavaWeaver.java | 115 ++------- .../abstracts/AJavaWeaverJoinPoint.java | 244 +++--------------- .../kadabra/importable/KadabraJoinPoints.java | 86 +++--- .../kadabra/joinpoints/JAndroidManifest.java | 5 +- .../kadabra/joinpoints/JAnnotation.java | 5 +- .../kadabra/joinpoints/JAnonymousExec.java | 10 +- .../src/weaver/kadabra/joinpoints/JApp.java | 35 +-- .../kadabra/joinpoints/JArrayAccess.java | 16 +- .../weaver/kadabra/joinpoints/JAssert.java | 9 +- .../kadabra/joinpoints/JAssignment.java | 15 +- .../kadabra/joinpoints/JBinaryExpression.java | 13 +- .../src/weaver/kadabra/joinpoints/JBody.java | 39 ++- .../src/weaver/kadabra/joinpoints/JBreak.java | 9 +- .../src/weaver/kadabra/joinpoints/JCall.java | 91 ++----- .../kadabra/joinpoints/JCallStatement.java | 14 +- .../src/weaver/kadabra/joinpoints/JCase.java | 13 +- .../src/weaver/kadabra/joinpoints/JCatch.java | 6 +- .../src/weaver/kadabra/joinpoints/JClass.java | 41 ++- .../weaver/kadabra/joinpoints/JComment.java | 11 +- .../kadabra/joinpoints/JConstructor.java | 70 +---- .../weaver/kadabra/joinpoints/JContinue.java | 9 +- .../kadabra/joinpoints/JDeclaration.java | 20 +- .../weaver/kadabra/joinpoints/JDoWhile.java | 11 +- .../weaver/kadabra/joinpoints/JEnumValue.java | 9 +- .../kadabra/joinpoints/JExecutable.java | 26 +- .../kadabra/joinpoints/JExpression.java | 75 ++---- .../joinpoints/JExpressionStatement.java | 15 +- .../src/weaver/kadabra/joinpoints/JField.java | 20 +- .../kadabra/joinpoints/JFieldAccess.java | 32 +-- .../src/weaver/kadabra/joinpoints/JFile.java | 80 +----- .../src/weaver/kadabra/joinpoints/JFor.java | 19 +- .../weaver/kadabra/joinpoints/JForEach.java | 9 +- .../kadabra/joinpoints/JGenericJoinPoint.java | 12 +- .../src/weaver/kadabra/joinpoints/JIf.java | 25 +- .../kadabra/joinpoints/JInterfaceType.java | 13 +- .../weaver/kadabra/joinpoints/JLibClass.java | 43 +-- .../weaver/kadabra/joinpoints/JLibMethod.java | 8 +- .../weaver/kadabra/joinpoints/JLiteral.java | 11 +- .../kadabra/joinpoints/JLocalVariable.java | 22 +- .../src/weaver/kadabra/joinpoints/JLoop.java | 30 +-- .../weaver/kadabra/joinpoints/JMethod.java | 68 +---- .../weaver/kadabra/joinpoints/JNamedType.java | 13 +- .../src/weaver/kadabra/joinpoints/JNew.java | 12 +- .../kadabra/joinpoints/JOpAssignment.java | 5 +- .../kadabra/joinpoints/JOpAssignmentAux.java | 10 +- .../weaver/kadabra/joinpoints/JPragma.java | 17 +- .../weaver/kadabra/joinpoints/JReference.java | 24 +- .../weaver/kadabra/joinpoints/JReturn.java | 13 +- .../kadabra/joinpoints/JSnippetExpr.java | 9 +- .../kadabra/joinpoints/JSnippetStmt.java | 29 +-- .../weaver/kadabra/joinpoints/JStatement.java | 39 +-- .../weaver/kadabra/joinpoints/JSwitch.java | 11 +- .../weaver/kadabra/joinpoints/JTernary.java | 15 +- .../src/weaver/kadabra/joinpoints/JThis.java | 5 +- .../src/weaver/kadabra/joinpoints/JThrow.java | 9 +- .../src/weaver/kadabra/joinpoints/JTry.java | 14 +- .../src/weaver/kadabra/joinpoints/JType.java | 68 ++--- .../kadabra/joinpoints/JTypeReference.java | 33 +-- .../kadabra/joinpoints/JUnaryExpression.java | 11 +- .../src/weaver/kadabra/joinpoints/JVar.java | 93 +------ .../src/weaver/kadabra/joinpoints/JWhile.java | 11 +- .../kadabra/joinpoints/JXmlElement.java | 5 +- .../weaver/kadabra/joinpoints/JXmlNode.java | 13 +- .../src/weaver/utils/KadabraAstMethods.java | 8 +- JavaWeaver/src/weaver/utils/SpoonUtils.java | 9 +- .../utils/android/AndroidResources.java | 30 +-- .../utils/generators/AdapterGenerator.java | 23 +- .../generators/FunctionalClassGenerator.java | 26 +- .../src/weaver/utils/weaving/ActionUtils.java | 164 +++--------- .../src/weaver/utils/weaving/SelectUtils.java | 60 ++--- .../converters/CtElement2JoinPoint.java | 73 +++--- .../converters/CtExecutable2AExecutable.java | 16 +- .../converters/CtExpression2AExpression.java | 78 +++--- .../converters/CtStatement2AStatement.java | 58 ++++- .../weaving/converters/CtType2AType.java | 17 +- .../weaving/converters/XmlNode2JoinPoint.java | 20 +- 77 files changed, 818 insertions(+), 1628 deletions(-) diff --git a/JavaWeaver/.gitignore b/JavaWeaver/.gitignore index 0eea28e5..0c20678d 100644 --- a/JavaWeaver/.gitignore +++ b/JavaWeaver/.gitignore @@ -3,6 +3,7 @@ src-weaved/* package.json src/weaver/kadabra/abstracts/ +!src/weaver/kadabra/abstracts/AJavaWeaverJoinPoint.java src/weaver/kadabra/exceptions/ src/weaver/kadabra/enums/ *.dotty diff --git a/JavaWeaver/src/weaver/kadabra/JavaWeaver.java b/JavaWeaver/src/weaver/kadabra/JavaWeaver.java index a68dc0d4..419eb572 100644 --- a/JavaWeaver/src/weaver/kadabra/JavaWeaver.java +++ b/JavaWeaver/src/weaver/kadabra/JavaWeaver.java @@ -46,10 +46,12 @@ /** * LARA Weaving Engine that uses Spoon as the Java compiler/processor
* Weaver Implementation for JavaWeaver
- * Since the generated abstract classes are always overwritten, their implementation should be done by extending those - * abstract classes with user-defined classes.
- * The abstract class {@link weaver.abstracts.AJoinPoint} can be used to add user-defined methods and fields which the - * user intends to add for all join points and are not intended to be used in LARA aspects. + * Since the generated abstract classes are always overwritten, their + * implementation should be done by extending those abstract classes with + * user-defined classes.
+ * The abstract class {@link weaver.abstracts.AJoinPoint} can be used to add + * user-defined methods and fields which the user intends to add for all join + * points and are not intended to be used in LARA aspects. * * @author Lara C. */ @@ -58,7 +60,6 @@ public class JavaWeaver extends AJavaWeaver { KadabraLog.setDebug(true); } - // private static final Set WEAVER_NAMES = SpecsCollections.asSet("kadabra"); private static final Set LANGUAGES = SpecsCollections.asSet("java"); // Fields @@ -76,7 +77,7 @@ public class JavaWeaver extends AJavaWeaver { private boolean noClassPath = false; // Continues even if an error of missing lib occurs private OutputType outType = OutputType.COMPILATION_UNITS; private final Report reportGear; - // private final JavaWeaverGear dependeciesGear = new JavaWeaverGear(); + private File temp; public JavaWeaver() { @@ -86,7 +87,8 @@ public JavaWeaver() { } /** - * Set a file/folder in the weaver if it is valid file/folder type for the weaver. + * Set a file/folder in the weaver if it is valid file/folder type for the + * weaver. * * @param sources the file with the source code * @param outputDir output directory for the generated file(s) @@ -107,19 +109,11 @@ protected boolean begin(List sources, File outputDir, DataStore args) { reset(); parseOptions(args); - // if (prettyPrint) { - // tempOutFolder = new File(IoUtils.getCanonicalPath(outputDir) + "_temp"); - // outputDir = tempOutFolder; - // } - if (prettyPrint) { this.outputDir.mkdirs(); - temp = getTemporaryWeaverFolder();// new File("_jw_temp"); + temp = getTemporaryWeaverFolder(); outputDir = temp; - // this.setOutputProcessor(temp, spoon, spoon.getEnvironment()); - // - // this.setInputSources(Arrays.asList(temp), spoon); } // Pass only Java files to spoon @@ -127,14 +121,10 @@ protected boolean begin(List sources, File outputDir, DataStore args) { var javaSources = getJavaSources(sources); spoon = newSpoon(javaSources, outputDir); - // spoon = newSpoon(sources, outputDir); this.currentOutputDir = outputDir; buildAndProcess(); - /* turning off path verifier as it is giving errors for new classes and code */ - // spoon.getEnvironment().setNoClasspath(true); - // spoon.getEnvironment().setNoClasspath(false); - jApp = JApp.newInstance(spoon, sources); - // spoon.getEnvironment().setAutoImports(false); + + jApp = JApp.newInstance(spoon, sources, this); return true; } @@ -210,7 +200,8 @@ private Optional getPackage(File javaFile) { } /** - * Closes the weaver to the specified output directory location, if the weaver generates new file(s) + * Closes the weaver to the specified output directory location, if the weaver + * generates new file(s) * * @return if close was successful */ @@ -234,12 +225,9 @@ protected boolean close() { if (prettyPrint) { spoon.prettyprint(); spoon = newSpoon(Arrays.asList(temp), outputDir); - // spoon.getEnvironment().setNoClasspath(true); - // spoon.getEnvironment().setNoClasspath(false); buildAndProcess(); spoon.prettyprint(); } else { - // System.out.println("PRESERVE? " + spoon.getEnvironment().isPreserveLineNumbers()); spoon.prettyprint(); } } @@ -281,8 +269,6 @@ public void rebuild(File inputFolder, File outputFolder) { spoon.prettyprint(); var newSpoon = newSpoon(Arrays.asList(inputFolder), outputFolder); - // newSpoon.getEnvironment().setNoClasspath(true); - // newSpoon.getEnvironment().setNoClasspath(false); buildAndProcess(newSpoon); newSpoon.prettyprint(); @@ -293,7 +279,8 @@ public void rebuild(File inputFolder, File outputFolder) { /** * Returns a list of Gears associated to this weaver engine * - * @return a list of implementations of {@link AGear} or null if no gears are available + * @return a list of implementations of {@link AGear} or null if no gears are + * available */ @Override public List getGears() { @@ -305,48 +292,23 @@ public List getGears() { private void reset() { SpoonUtils.resetCounter(); table.reset(); - /*RESET GEARS*/ + /* RESET GEARS */ reportGear.reset(); } /** - * Instantiates a new {@link JWSpoonLauncher} based on the given input sources and the properties of this - * {@link JavaWeaver} instance. + * Instantiates a new {@link JWSpoonLauncher} based on the given input sources + * and the properties of this {@link JavaWeaver} instance. * * @param sources the input sources to parse * @return */ private JWSpoonLauncher newSpoon(List sources, File outputDir) { - // Launcher.LOGGER.setLevel(Level.INFO); - // Logger.getRootLogger().setLevel(Level.TRACE); - - // try { - // Launcher.LOGGER.addAppender(new FileAppender(new SimpleLayout(), "logg.txt")); - // } catch (IOException e1) { - // SpecsLogs.warn("Error message:\n", e1); - // } - - // try { - // BasicConfigurator.configure(new FileAppender(new SimpleLayout(), "logg.txt")); - // } catch (IOException e1) { - // SpecsLogs.warn("Error message:\n", e1); - // } - JWSpoonLauncher spoon = new JWSpoonLauncher(sources); - // String[] spoonArgs = { "--level", "ERROR" }; - // spoon.setArgs(spoonArgs); - Environment environment = spoon.getFactory().getEnvironment(); - // System.out.println("LEVE: " + environment.getLevel()); - // environment.setLevel("WARN"); - // System.out.println("NEW LEVE: " + environment.getLevel()); - // environment.setLevel("WARN"); - // System.out.println("LEVEL: " + Launcher.LOGGER.getLevel()); - // Launcher.LOGGER.setLevel(Level.TRACE); - // System.out.println("LEVEL NEW: " + Launcher.LOGGER.getLevel()); - spoon.setArgs(new String[]{"--output-type", outType.toString()}); // required to define the type of output... + spoon.setArgs(new String[] { "--output-type", outType.toString() }); // required to define the type of output... if (!classPath.isEmpty()) { @@ -357,7 +319,6 @@ private JWSpoonLauncher newSpoon(List sources, File outputDir) { processedClasspath.addAll(classPath); var additionalJars = classPath.stream() .filter(classPath -> classPath.isDirectory()) - // .flatMap(folder -> SpecsIo.getFiles(folder, "jar").stream()) .flatMap(folder -> SpecsIo.getFilesRecursive(folder, "jar").stream()) .collect(Collectors.toList()); SpecsLogs.debug("Adding JARs to classpath: " + additionalJars); @@ -366,39 +327,25 @@ private JWSpoonLauncher newSpoon(List sources, File outputDir) { List filesStr = processedClasspath.stream().map(SpecsIo::getCanonicalPath) .collect(Collectors.toList()); String[] classPathArray = filesStr.toArray(new String[0]); - // KadabraLog.info(filesStr); environment.setSourceClasspath(classPathArray); - // KadabraLog.info(Arrays.toString(environment.getSourceClasspath()); } catch (Exception e) { throw new JavaWeaverException("setting the classpath", e); } } - // environment.disableConsistencyChecks(); // Spoon 8 - // environment.setSelfChecks(false); // Spoon 6 - // environment.setSelfChecks(true); - // environment.setAutoImports(true); - environment.setCommentEnabled(true); - // environment.setGenerateJavadoc(true); + environment.setCommentEnabled(true); setOutputProcessor(outputDir, spoon, environment); - // the output type: compilation units) environment.setNoClasspath(noClassPath); - // environment.setNoClasspath(false); setInputSources(sources, spoon); spoon.addProcessor(new IfProcessor()); - // spoon.addProcessor(new CommentProcessor()); // Set fully qualified names - // environment.setAutoImports(true); - // environment.setAutoImports(!args.get(JavaWeaverKeys.FULLY_QUALIFIED_NAMES)); if (args.get(JavaWeaverKeys.FULLY_QUALIFIED_NAMES)) { environment.setAutoImports(false); } else { environment.setAutoImports(true); } - // environment.setPreserveLineNumbers(false); - environment.setCopyResources(args.get(JavaWeaverKeys.COPY_RESOURCES)); environment.setComplianceLevel(args.get(JavaWeaverKeys.JAVA_COMPLIANCE_LEVEL)); @@ -420,11 +367,11 @@ private static void setInputSources(List sources, Launcher spoon) { } private static void setOutputProcessor(File outputDir, Launcher spoon, Environment environment) { - // JavaOutputProcessor outProcessor = spoon.createOutputWriter(outputDir, environment); // Spoon 6 - JavaOutputProcessor outProcessor = spoon.createOutputWriter(); // Spoon 8 - environment.setDefaultFileGenerator(outProcessor); // Define output folder (needed for the output type: classes) - // spoon.setOutputDirectory(IoUtils.getCanonicalPath(outputDir)); // Define output folder AGAIN (needed for the + JavaOutputProcessor outProcessor = spoon.createOutputWriter(); + // Define output folder (needed for the output type: classes) + environment.setDefaultFileGenerator(outProcessor); + spoon.setSourceOutputDirectory(SpecsIo.getCanonicalPath(outputDir));// Define output folder AGAIN spoon.setBinaryOutputDirectory(SpecsIo.getCanonicalPath(outputDir)); // Define output folder AGAIN (needed for } @@ -436,7 +383,6 @@ private static void setOutputProcessor(File outputDir, Launcher spoon, Environme */ private void parseOptions(DataStore args) { - // System.out.println("IN JavaWeaver.parseOptions\n" + args); if (args.hasValue(JavaWeaverKeys.CLEAR_OUTPUT_FOLDER)) { clearOutputFolder = args.get(JavaWeaverKeys.CLEAR_OUTPUT_FOLDER); } @@ -526,15 +472,8 @@ public String getName() { return "KADABRA"; } - /** - * Get weaver with this type - **/ - public static JavaWeaver getJavaWeaver() { - return (JavaWeaver) getThreadLocalWeaver(); - } - - public static SpoonFactory getFactory() { - return new SpoonFactory(getJavaWeaver().spoon.getFactory()); + public SpoonFactory getFactory() { + return new SpoonFactory(spoon.getFactory()); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/abstracts/AJavaWeaverJoinPoint.java b/JavaWeaver/src/weaver/kadabra/abstracts/AJavaWeaverJoinPoint.java index 3bf892b9..42075cc9 100644 --- a/JavaWeaver/src/weaver/kadabra/abstracts/AJavaWeaverJoinPoint.java +++ b/JavaWeaver/src/weaver/kadabra/abstracts/AJavaWeaverJoinPoint.java @@ -26,14 +26,21 @@ import java.util.stream.Stream; /** - * Abstract class which can be edited by the developer. This class will not be overwritten. + * Abstract class which can be edited by the developer. This class will not be + * overwritten. * * @author Lara Weaver Generator */ public abstract class AJavaWeaverJoinPoint extends AJoinPoint { - // public static final Map CLONED_NODES = new HashMap<>(); + public AJavaWeaverJoinPoint(JavaWeaver weaver) { + super(weaver); + } + @Override + public JavaWeaver getWeaverEngine() { + return (JavaWeaver) super.getWeaverEngine(); + } @Override public boolean equals(Object obj) { @@ -44,12 +51,13 @@ public boolean equals(Object obj) { return false; } - /** - * Compares the two join points based on their node reference of the used compiler/parsing tool.
+ * Compares the two join points based on their node reference of the used + * compiler/parsing tool.
* This is the default implementation for comparing two join points.
- * Note for developers: A weaver may override this implementation in the editable abstract join point, so the - * changes are made for all join points, or override this method in specific join points. + * Note for developers: A weaver may override this implementation in the + * editable abstract join point, so the changes are made for all join points, or + * override this method in specific join points. */ @Override public boolean compareNodes(AJoinPoint aJoinPoint) { @@ -63,45 +71,12 @@ public String getSrcCodeImpl() { @Override public String getCodeImpl() { - // return getNode().getFactory().getEnvironment().createPrettyPrinter().printElement(getNode()); - - return JavaWeaver.getJavaWeaver().getSourceCodePrinter().getSourceCode(getNode()); - - // return new DefaultJavaPrettyPrinter(getNode().getFactory().getEnvironment()).printElement(getNode()); - - // return new SourceCodePrinter(getNode().getFactory().getEnvironment()).printElement(getNode()); - - // DefaultJavaPrettyPrinter printer = JavaWeaver.getJavaWeaver().getPrinter(); - // var node = getNode(); - // String errorMessage = ""; - // try { - // // we do not want to compute imports of for CtImport and CtReference - // // as it may change the print of a reference - // if (!(node instanceof CtImport) && !(node instanceof CtReference)) { - // printer.getImportsContext().computeImports(this); - // } - // printer.scan(node); - // } catch (ParentNotInitializedException ignore) { - // SpecsLogs.debug("Could not get code for " + this + ": " + ignore); - // // throw new RuntimeException("Could not get code for node " + this, ignore); - // // LOGGER.error(ERROR_MESSAGE_TO_STRING, ignore); - // // errorMessage = ERROR_MESSAGE_TO_STRING; - // } - // // in line-preservation mode, newlines are added at the beginning to matches the lines - // // removing them from the toString() representation - // return printer.toString().replaceFirst("^\\s+", "") + errorMessage; - - // return getNode().toString(); // temporary - // return getNode().toString() + "\n"; // temporary + return getWeaverEngine().getSourceCodePrinter().getSourceCode(getNode()); } @Override public abstract CtElement getNode(); - // public CtElement getParent() { - // return getNode().getParent(); - // } - @Override public void setLineImpl(int value) { CtElement node = getNode(); @@ -137,12 +112,8 @@ public AJoinPoint getParentImpl() { return null; } - // System.out.println("JP: " + getClass()); - // System.out.println("NODE: " + getNode().getClass()); - // System.out.println("PARENT J: " + parent.getClass()); + var parentJp = CtElement2JoinPoint.convert(parent, getWeaverEngine()); - var parentJp = CtElement2JoinPoint.convert(parent); - // System.out.println("PARENT JP: " + parentJp.getClass()); // Special case: if parent is a CallStatement, return the Call instead if (parentJp instanceof ACallStatement) { return ((ACallStatement) parentJp).getCallImpl(); @@ -172,54 +143,31 @@ public Optional getAncestorTry(Class ancestorType) { public AJoinPoint getAncestorImpl(String type) { Preconditions.checkNotNull(type, "Missing type of ancestor in attribute 'ancestor'"); - // System.out.println("Getting ancestor '" + type + "' of " + getJoinPointType()); - AJoinPoint currentNode = getParentImpl(); while (currentNode != null) { - // System.out.println("Parent " + currentNode.getJoinPointType() + " is '" + type + "'?"); if (currentNode.instanceOf(type)) { - // System.out.println("Yes!"); return currentNode; } - // System.out.println("No.."); currentNode = currentNode.getParentImpl(); } return currentNode; - - // CtElement currentNode = getNode().getParent(); - // while (currentNode != null) { - // System.out.println("CURRENT NODE: " + currentNode.getClass()); - // - // AJavaWeaverJoinPoint parentJp = CtElement2JoinPoint.convert(currentNode); - // - // if (parentJp.instanceOf(type)) { - // return parentJp; - // } - // // String joinPointType = parentJp.getJoinPointType(); - // // if (joinPointType.equals(type)) { - // // return parentJp; - // // } - // currentNode = currentNode.getParent(); - // } - // - // return null; } protected AExpression toAExpression(CtExpression expression) { - return CtExpression2AExpression.convertToExpression(expression); + return CtExpression2AExpression.convertToExpression(expression, getWeaverEngine()); } protected AJavaWeaverJoinPoint toAStatement(CtStatement statement) { - return CtStatement2AStatement.convert(statement); + return CtStatement2AStatement.convert(statement, getWeaverEngine()); } protected AType toAType(CtType type) { - return CtType2AType.convert(type); + return CtType2AType.convert(type, getWeaverEngine()); } protected AExecutable toAExecutable(CtExecutable exec) { - return CtExecutable2AExecutable.convert(exec); + return CtExecutable2AExecutable.convert(exec, getWeaverEngine()); } @Override @@ -233,25 +181,11 @@ public Integer getLineImpl() { } return position.getLine(); - // // Check if this joinpoint is a statement - // if (this instanceof AStatement) { - // return ((AStatement) this).getLineImpl(); - // } - // - // // Try to obtain a statement - // AJavaWeaverJoinPoint stmtAncestor = ancestorImpl("statement"); - // if (stmtAncestor instanceof AStatement) { - // return ((AStatement) stmtAncestor).getLineImpl(); - // } - // - // SpecsLogs.msgInfo("attribute 'line' not implemented for join point " + getJoinPointType() - // + " that is not inside a statement"); - // - // return -1; } /** - * Required, because original insertImpl returns JoinPoint, but abstract join points return AJoinPoint. + * Required, because original insertImpl returns JoinPoint, but abstract join + * points return AJoinPoint. */ @Override public AJoinPoint[] insertImpl(String position, String code) { @@ -280,20 +214,13 @@ public AJoinPoint insertAfterImpl(String code) { return insertImpl("after", code)[0]; } - // @Override - // public AJoinPoint[] insertImpl(String position, String code) { - // return insertImpl("after", code); - // } - @Override public AJoinPoint insertReplaceImpl(AJoinPoint jp) { - // return insertImpl("replace", jp)[0]; return replaceWithImpl(jp); } @Override public AJoinPoint insertReplaceImpl(String code) { - // return insertImpl("replace", code)[0]; return replaceWithImpl(code); } @@ -307,11 +234,6 @@ public AJoinPoint replaceWithImpl(String code) { return insertImpl("replace", code)[0]; } - // @Override - // public AJoinPoint[] insertImpl(String position, T JoinPoint) { - // throw new NotImplementedException(this); - // } - @Override public AJoinPoint[] insertImpl(String position, JoinPoint JoinPoint) { throw new NotImplementedException(this); @@ -319,48 +241,7 @@ public AJoinPoint[] insertImpl(String position, JoinPoint JoinPoint) { @Override public AJoinPoint[] getDescendantsArrayImpl() { - return getJpDescendantsStream().toArray(size -> new AJoinPoint[size]); - /* - if (this instanceof JApp) { - JApp app = (JApp) this; - - List descendants = new ArrayList<>(); - for (AFile file : app.selectFile()) { - descendants.add(file); - descendants.addAll(Arrays.asList(file.getDescendantsArrayImpl())); - } - // for (ALibClass libClass : app.selectLibClass()) { - // descendants.addAll(Arrays.asList(libClass.getDescendantsArrayImpl())); - // } - - return descendants.toArray(new AJoinPoint[0]); - } - - if (this instanceof JFile) { - JFile jfile = (JFile) this; - - List descendants = new ArrayList<>(); - for (var file : jfile.getNode().getCu().getDeclaredTypes()) { - AJavaWeaverJoinPoint type = CtElement2JoinPoint.convertTry(file).orElse(null); - if (type == null) { - continue; - } - - descendants.add(type); - descendants.addAll(Arrays.asList(type.getDescendantsArrayImpl())); - } - - return descendants.toArray(new AJoinPoint[0]); - } - - return getNode().getElements(element -> true) - .stream() - .map(CtElement2JoinPoint::convertTry) - .filter(Optional::isPresent) - .map(Optional::get) - .toArray(size -> new AJoinPoint[size]); - */ } @Override @@ -374,10 +255,6 @@ public Boolean getIsBlockImpl() { return getNode() instanceof CtBlock; } - // @Override - // public Boolean getIsBlockStatementImpl() { - // return SpoonUtils.isStatementInBlock(getNode()); - // } @Override public AJoinPoint copyImpl() { // Clone the node @@ -385,10 +262,7 @@ public AJoinPoint copyImpl() { // Set the parent copy.setParent(getNode().getParent()); - // CLONED_NODES.put(copy, getNode()); - - return CtElement2JoinPoint.convert(copy); - // throw new RuntimeException(".copy not implemented yet for join point " + getJoinPointType()); + return CtElement2JoinPoint.convert(copy, getWeaverEngine()); } private List getChildrenNodes() { @@ -397,8 +271,6 @@ private List getChildrenNodes() { @Override public Stream getJpChildrenStream() { - // return getChildrenNodes().stream() - // .map(CtElement2JoinPoint::convert); return Arrays.stream(getChildrenArrayImpl()); } @@ -410,20 +282,18 @@ public JoinPoint getJpParent() { @Override public AJoinPoint[] getChildrenArrayImpl() { return getChildrenNodes().stream() - .map(CtElement2JoinPoint::convert) + .map(node -> CtElement2JoinPoint.convert(node, getWeaverEngine())) .toArray(size -> new AJoinPoint[size]); } @Override public AJoinPoint childImpl(Integer index) { return getChildrenArrayImpl()[index]; - // return CtElement2JoinPoint.convert(getChildrenNodes().get(index)); } @Override public Integer getNumChildrenImpl() { return getChildrenArrayImpl().length; - // return getChildrenNodes().size(); } @Override @@ -436,70 +306,27 @@ public String getAstImpl() { } // This method is more robust regarding the initial node - return SpoonUtils.toAst(getNode(), ""); + return SpoonUtils.toAst(getNode(), "", getWeaverEngine()); } @Override public String toString() { - // return getJoinPointType(); return getNode().toString(); } @Override public void removeImpl() { // Delete from annotations - JWEnvironment env = ActionUtils.getKadabraEnvironment(JavaWeaver.getFactory().getSpoonFactory()); + JWEnvironment env = ActionUtils.getKadabraEnvironment(getWeaverEngine().getFactory().getSpoonFactory()); // TODO: This remove can be optimized - // System.out.println("NODE HAS PARENT? " + getNode().isParentInitialized()); - // System.out.println("NODE PARENT? " + getNode().getParent()); env.getTable().remove(getNode()); - // getNode().replace(Collections.emptyList()); // Spoon 6 - getNode().delete(); // Spoon 8 - - } - - // /** - // * If node implements CtModifiable, returns the modifiers. Otherwise, returns empty set. - // * - // * @return - // */ - // // @SuppressWarnings("unchecked") - // public Set getModifiersInternal() { - // var node = getNode(); - // - // if (node instanceof CtModifiable) { - // return ((CtModifiable) node).getModifiers(); - // } - // - // return Collections.emptySet(); - // // - // // // Choose best method - // // Method invokingMethod = SpecsSystem.getMethod(getNode().getClass(), "getModifiers"); - // // - // // // Could not find method, return empty set - // // if (invokingMethod == null) { - // // return Collections.emptySet(); - // // - // // } - // // - // // // Invoke method - // // try { - // // return (Set) invokingMethod.invoke(getNode()); - // // } catch (Exception e) { - // // throw new RuntimeException("Exception while calling getModifiers(): ", e); - // // } - // } + getNode().delete(); + } - /** - * - */ @Override public String[] getModifiersArrayImpl() { return modifiersToString(SpoonUtils.getModifiers(getNode())); - // return JoinPoints.getModifiersInternal(this).stream() - // .map(ModifierKind::name) - // .toArray(length -> new String[length]); } public String[] modifiersToString(Collection modifiers) { @@ -519,21 +346,10 @@ public Boolean hasModifierImpl(String modifier) { } return SpoonUtils.getModifiers(getNode()).contains(modifierKind); - // var modifierLowerCase = modifier.toLowerCase(); - // - // return Arrays.stream(getModifiersArrayImpl()) - // .map(String::toLowerCase) - // .filter(currentModifier -> currentModifier.equals(modifierLowerCase)) - // .findFirst() - // .isPresent(); } @Override public Boolean getIsFinalImpl() { - // System.out.println("JP: " + getNode().getShortRepresentation() + ":" + - // JoinPoints.getModifiersInternal(this)); - // System.out.println("JP: " + getClass() + ":" + JoinPoints.getModifiersInternal(this)); - // System.out.println("NODE: " + getNode().getClass() + ":" + JoinPoints.getModifiersInternal(this)); return SpoonUtils.getModifiers(getNode()).contains(ModifierKind.FINAL); } @@ -542,13 +358,11 @@ public Boolean getIsStaticImpl() { return SpoonUtils.getModifiers(getNode()).contains(ModifierKind.STATIC); } - ; - @Override public AAnnotation[] getAnnotationsArrayImpl() { return getNode().getAnnotations().stream() - .map(annotation -> (AAnnotation) SelectUtils.expression2JoinPoint(annotation)) + .map(annotation -> (AAnnotation) SelectUtils.expression2JoinPoint(annotation, getWeaverEngine())) .collect(Collectors.toList()) .toArray(size -> new AAnnotation[size]); } diff --git a/JavaWeaver/src/weaver/kadabra/importable/KadabraJoinPoints.java b/JavaWeaver/src/weaver/kadabra/importable/KadabraJoinPoints.java index 69349e39..42299e79 100644 --- a/JavaWeaver/src/weaver/kadabra/importable/KadabraJoinPoints.java +++ b/JavaWeaver/src/weaver/kadabra/importable/KadabraJoinPoints.java @@ -39,12 +39,12 @@ public class KadabraJoinPoints { * Creates a new comment join point. * * @param comment - * the contents of the comment + * the contents of the comment * @param type - * the type of comment, according to CtComment.CommentType + * the type of comment, according to CtComment.CommentType * @return */ - public static JComment comment(String comment, String type) { + public static JComment comment(JavaWeaver weaver, String comment, String type) { // Convert the type CommentType typeEnum = null; @@ -55,20 +55,20 @@ public static JComment comment(String comment, String type) { "Comment type not supported: '" + type + "'. Use one of " + Arrays.toString(CommentType.values())); } - return (JComment) CtElement2JoinPoint.convert(JavaWeaver.getFactory().comment(comment, typeEnum)); + return CtElement2JoinPoint.convert(weaver.getFactory().comment(comment, typeEnum), weaver, JComment.class); } /** * Creates a new expression join point that represents the given literal. * * @param type - * the type of the literal + * the type of the literal * @param literal - * a string representing a Java literal. In the case it is signed, returns a unaryExpression instead of a - * literal + * a string representing a Java literal. In the case it is + * signed, returns a unaryExpression instead of a literal * @return */ - public static Object literal(String literal, String type) { + public static Object literal(JavaWeaver weaver, String literal, String type) { boolean isNegative = false; // Check if negative @@ -78,62 +78,41 @@ public static Object literal(String literal, String type) { } // Check type of literal - var decodedValue = SpoonLiterals.decodeLiteralValue(type, literal); - // If a number, check if it is a negative value - // boolean isNegative = decodedValue instanceof Number ? ((Number) decodedValue).doubleValue() < 0 : false; - - CtExpression expressionNode = JavaWeaver.getFactory().literal(decodedValue); + CtExpression expressionNode = weaver.getFactory().literal(decodedValue); if (isNegative) { - expressionNode = JavaWeaver.getFactory().unaryOperator(UnaryOperatorKind.NEG, expressionNode); + expressionNode = weaver.getFactory().unaryOperator(UnaryOperatorKind.NEG, expressionNode); } - return CtElement2JoinPoint.convert(expressionNode); + return CtElement2JoinPoint.convert(expressionNode, weaver); } - public static Object nullLiteral(Object referenceJp) { + public static Object nullLiteral(JavaWeaver weaver, Object referenceJp) { if (referenceJp != null) { SpecsCheck.checkArgument(referenceJp instanceof JoinPoint, () -> "Reference join point must be a join point, it is a " + referenceJp.getClass().getSimpleName()); } - var factory = JavaWeaver.getFactory().getSpoonFactory(); + var factory = weaver.getFactory().getSpoonFactory(); CtElement nullLiteral = factory.createLiteral(null); - // - // if (referenceJp != null) { - // var node = ((AJavaWeaverJoinPoint) referenceJp).getNode(); - // var children = node.getDirectChildren(); - // if (!children.isEmpty()) { - // var firstChild = children.get(0); - // - // if (firstChild instanceof CtTypeReference) { - // var copy = (CtTypeReference) firstChild.clone(); - // - // var castNode = factory.Code().createTypeCast(copy, nullLiteral); - // } - // // System.out.println("FIRST CHILD: " + firstChild); - // // System.out.println("FIRST CHILD CLASS: " + firstChild.getClass()); - // } - // } - - return CtElement2JoinPoint.convert(nullLiteral); + return CtElement2JoinPoint.convert(nullLiteral, weaver); } /** * Creates a new unary operator for the given operation and expression. * * @param operator - * the operator of the unary expression + * the operator of the unary expression * @param operand - * an expression join point + * an expression join point * @return */ - public static Object unaryOperator(String operator, Object operand) { + public static Object unaryOperator(JavaWeaver weaver, String operator, Object operand) { SpecsCheck.checkArgument(operand instanceof JoinPoint, () -> "Operand must be a join point, it " + operator.getClass().getSimpleName()); @@ -148,21 +127,23 @@ public static Object unaryOperator(String operator, Object operand) { // Convert string to kind UnaryOperatorKind opKind = OperatorUtils.parseUnary(operator); - return CtElement2JoinPoint.convert(JavaWeaver.getFactory().unaryOperator(opKind, nodeExpr)); + return CtElement2JoinPoint.convert(weaver.getFactory().unaryOperator(opKind, nodeExpr), weaver); } /** * Creates a new unary operator for the given operation and expression. * * @param operator - * the operator of the binary expression + * the operator of the binary expression * @param lhs - * a join point representing the left hand of the binary expression + * a join point representing the left hand of the binary + * expression * @param rhs - * a join point representing the right hand of the binary expression + * a join point representing the right hand of the binary + * expression * @return */ - public static Object binaryOperator(String operator, Object lhs, Object rhs) { + public static Object binaryOperator(JavaWeaver weaver, String operator, Object lhs, Object rhs) { SpecsCheck.checkArgument(lhs instanceof JoinPoint, () -> "Lhs must be a join point, it " + operator.getClass().getSimpleName()); @@ -183,10 +164,10 @@ public static Object binaryOperator(String operator, Object lhs, Object rhs) { // Convert string to kind BinaryOperatorKind opKind = OperatorUtils.parseBinary(operator); - return CtElement2JoinPoint.convert(JavaWeaver.getFactory().binaryOperator(opKind, nodeLhs, nodeRhs)); + return CtElement2JoinPoint.convert(weaver.getFactory().binaryOperator(opKind, nodeLhs, nodeRhs), weaver); } - public static Object assignment(Object lhs, Object rhs) { + public static Object assignment(JavaWeaver weaver, Object lhs, Object rhs) { Objects.requireNonNull(lhs, () -> "lhs cannot be null"); Objects.requireNonNull(rhs, () -> "rhs cannot be null"); SpecsCheck.checkArgument(lhs instanceof JoinPoint, @@ -205,13 +186,13 @@ public static Object assignment(Object lhs, Object rhs) { CtExpression nodeLhs = (CtExpression) jpLhs.getNode(); CtExpression nodeRhs = (CtExpression) jpRhs.getNode(); - return CtElement2JoinPoint.convert(JavaWeaver.getFactory().assignment(nodeLhs, nodeRhs)); + return CtElement2JoinPoint.convert(weaver.getFactory().assignment(nodeLhs, nodeRhs), weaver); } - public static Object var(JLocalVariable localVariable, boolean isWrite) { + public static Object var(JavaWeaver weaver, JLocalVariable localVariable, boolean isWrite) { var localVarSpoon = localVariable.getNode(); - return CtElement2JoinPoint.convert(JavaWeaver.getFactory().var(localVarSpoon, isWrite)); + return CtElement2JoinPoint.convert(weaver.getFactory().var(localVarSpoon, isWrite), weaver); } /** @@ -220,13 +201,8 @@ public static Object var(JLocalVariable localVariable, boolean isWrite) { * @param code * @return */ - public static Object snippetExpression(String code) { + public static Object snippetExpression(JavaWeaver weaver, String code) { return CtElement2JoinPoint - .convert(SnippetFactory.createSnippetExpression(JavaWeaver.getFactory().getSpoonFactory(), code)); + .convert(SnippetFactory.createSnippetExpression(weaver.getFactory().getSpoonFactory(), code), weaver); } - - // public static Object literal2(String literal, String type) { - // var expressionNode = JavaWeaver.getFactory().literal(Integer.valueOf(1)); - // return CtElement2JoinPoint.convert(expressionNode); - // } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JAndroidManifest.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JAndroidManifest.java index 5e1df273..9dc72821 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JAndroidManifest.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JAndroidManifest.java @@ -16,6 +16,7 @@ import org.json.XML; import pt.up.fe.specs.util.xml.XmlDocument; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AAndroidManifest; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; @@ -23,8 +24,8 @@ public class JAndroidManifest extends AAndroidManifest { private final XmlDocument manifest; - public JAndroidManifest(XmlDocument manifest) { - super(new JXmlNode(manifest)); + public JAndroidManifest(XmlDocument manifest, JavaWeaver weaver) { + super(new JXmlNode(manifest, weaver), weaver); this.manifest = manifest; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JAnnotation.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JAnnotation.java index 3aa806f6..4a9e70a9 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JAnnotation.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JAnnotation.java @@ -15,14 +15,15 @@ import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AAnnotation; public class JAnnotation extends AAnnotation { private final CtAnnotation annotation; - public JAnnotation(CtAnnotation annotation) { - super(new JExpression<>(annotation)); + public JAnnotation(CtAnnotation annotation, JavaWeaver weaver) { + super(new JExpression<>(annotation, weaver), weaver); this.annotation = annotation; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JAnonymousExec.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JAnonymousExec.java index be610a36..24c8fc02 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JAnonymousExec.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JAnonymousExec.java @@ -15,24 +15,24 @@ import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AAnonymousExec; public class JAnonymousExec extends AAnonymousExec { private CtAnonymousExecutable node; - private JAnonymousExec(CtAnonymousExecutable executable) { - super(JExecutable.newInstance(executable)); + public JAnonymousExec(CtAnonymousExecutable executable, JavaWeaver weaver) { + super(JExecutable.newInstance(executable, weaver), weaver); this.node = executable; } - public static JAnonymousExec newInstance(CtAnonymousExecutable executable) { - return new JAnonymousExec(executable); + public static JAnonymousExec newInstance(CtAnonymousExecutable executable, JavaWeaver weaver) { + return new JAnonymousExec(executable, weaver); } @Override public CtElement getNode() { - return node; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JApp.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JApp.java index 48073bc2..6d8158ec 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JApp.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JApp.java @@ -20,6 +20,7 @@ import spoon.reflect.declaration.CtInterface; import spoon.reflect.factory.Factory; import spoon.support.gui.SpoonModelTree; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.*; import weaver.kadabra.spoon.extensions.nodes.CtApp; import weaver.utils.android.AndroidResources; @@ -39,20 +40,21 @@ public class JApp extends AApp { private final Set sources; private final AndroidResources androidResources; - private JApp(Launcher spoon, List sources) { + private JApp(Launcher spoon, List sources, JavaWeaver weaver) { + super(weaver); this.spoon = spoon; this.sources = new HashSet<>(sources); this.androidResources = AndroidResources.newInstance(sources); } - public static JApp newInstance(Launcher spoon, List sources) { - var app = new JApp(spoon, sources); + public static JApp newInstance(Launcher spoon, List sources, JavaWeaver weaver) { + var app = new JApp(spoon, sources, weaver); return app; } - public static JApp newInstance(CtApp app) { - return new JApp(app.spoon, Collections.emptyList()); + public static JApp newInstance(CtApp app, JavaWeaver weaver) { + return new JApp(app.spoon, Collections.emptyList(), weaver); } public AndroidResources getAndroidResources() { @@ -62,7 +64,7 @@ public AndroidResources getAndroidResources() { private List retrieveFiles() { final List files = spoon.getFactory().CompilationUnit().getMap().values().stream() - .map(JFile::new) + .map(cu -> new JFile(cu, getWeaverEngine())) .collect(Collectors.toList()); return files; @@ -83,14 +85,12 @@ public AClass newClassImpl(String name) { @Override public AClass newClassImpl(String name, String extend, String[] implement) { if (name == null || name.isEmpty()) { - throw new NullPointerException("the name of the new class cannot be null or empty"); } - // KadabraLog.debug("GENERATING NEW CLASS: " + name); var cu = ActionUtils.compilationUnitWithClass(name, extend, implement, spoon.getModelBuilder().getBinaryOutputDirectory(), spoon.getFactory()); CtClass mainClass = (CtClass) cu.getMainType(); - AClass newInstance = JClass.newInstance(mainClass, cu); + AClass newInstance = JClass.newInstance(mainClass, cu, getWeaverEngine()); return newInstance; } @@ -105,7 +105,7 @@ public AInterfaceType newInterfaceImpl(String name, String[] extend) { final CtInterface newInterface = ActionUtils.compilationUnitWithInterface(name, extend, spoon.getModelBuilder().getBinaryOutputDirectory(), spoon.getFactory()); - JInterfaceType newInstance = JInterfaceType.newInstance(newInterface); + JInterfaceType newInstance = JInterfaceType.newInstance(newInterface, getWeaverEngine()); return newInstance; } @@ -115,7 +115,7 @@ public AClass mapVersionsImpl(String name, String keyType, AInterfaceType _inter File outDir = spoon.getModelBuilder().getBinaryOutputDirectory(); Factory factory = spoon.getFactory(); var cu = MapGenerator.generate(factory, name, keyType, _interface, methodName, outDir); - JClass newInstance = JClass.newInstance((CtClass) cu.getMainType(), cu); + JClass newInstance = JClass.newInstance((CtClass) cu.getMainType(), cu, getWeaverEngine()); return newInstance; } @@ -124,7 +124,6 @@ public String showASTImpl(String title) { // SpoonModelTree window starts in the constructor SpoonModelTree tree = new SpoonModelTree(spoon.getFactory()); tree.setTitle(title); - // tree.isDefaultLookAndFeelDecorated(); tree.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); return ""; } @@ -182,22 +181,12 @@ public AJoinPoint[] getChildrenArrayImpl() { @Override public AAndroidManifest getManifestImpl() { var manifest = androidResources.getAndroidManifest(); - // var elementAttrs = manifest.getElementsByName("uses-permission").stream() - // .map(element -> element.getAttribute("android:name")) - // .collect(Collectors.joining(", ")); - // System.out.println("ELEMENTS: " + elementAttrs); - return manifest != null ? new JAndroidManifest(manifest) : null; + return manifest != null ? new JAndroidManifest(manifest, getWeaverEngine()) : null; } - // @Override - // public Stream getJpChildrenStream() { - // return spoon.getFactory().CompilationUnit().getMap().values().stream().map(JFile::new); - // } - // @Override public AFile[] getFilesArrayImpl() { return retrieveFiles().toArray(size -> new AFile[size]); - // return getJpChildrenStream().toArray(size -> new AFile[size]); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JArrayAccess.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JArrayAccess.java index 990fe5ec..8297bb3f 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JArrayAccess.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JArrayAccess.java @@ -16,6 +16,7 @@ import spoon.reflect.code.CtArrayAccess; import spoon.reflect.code.CtArrayWrite; import spoon.reflect.code.CtExpression; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AArrayAccess; import weaver.kadabra.abstracts.joinpoints.ATypeReference; import weaver.kadabra.enums.RefType; @@ -24,14 +25,14 @@ public class JArrayAccess> extends AArrayAccess { private final CtArrayAccess node; - protected JArrayAccess(CtArrayAccess acess) { - super(new JExpression<>(acess)); - node = acess; + protected JArrayAccess(CtArrayAccess access, JavaWeaver weaver) { + super(new JExpression<>(access, weaver), weaver); + this.node = access; } - public static > JArrayAccess newInstance(CtArrayAccess access) { - - return new JArrayAccess<>(access); + public static > JArrayAccess newInstance(CtArrayAccess access, + JavaWeaver weaver) { + return new JArrayAccess<>(access, weaver); } @Override @@ -41,8 +42,7 @@ public String getReferenceImpl() { @Override public ATypeReference getTypeReferenceImpl() { - return new JTypeReference<>(node.getType()); - // return CtTypeReferenceUtils.getType(node.getType()); + return new JTypeReference<>(node.getType(), getWeaverEngine()); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JAssert.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JAssert.java index 0096379f..dd9bec17 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JAssert.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JAssert.java @@ -14,19 +14,20 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtAssert; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AAssert; public class JAssert extends AAssert { private final CtAssert node; - private JAssert(CtAssert node) { - super(new JStatement(node)); + private JAssert(CtAssert node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JAssert newInstance(CtAssert node) { - return new JAssert<>(node); + public static JAssert newInstance(CtAssert node, JavaWeaver weaver) { + return new JAssert<>(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JAssignment.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JAssignment.java index db069a9c..f1f4bd33 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JAssignment.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JAssignment.java @@ -16,6 +16,7 @@ import spoon.reflect.code.CtAssignment; import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtOperatorAssignment; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AAssignment; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -24,16 +25,16 @@ public class JAssignment extends AAssignment { private final CtAssignment node; - protected JAssignment(CtAssignment node) { - super(new JStatement(node)); + protected JAssignment(CtAssignment node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JAssignment newInstance(CtAssignment node) { + public static JAssignment newInstance(CtAssignment node, JavaWeaver weaver) { if (node instanceof CtOperatorAssignment) { - return JOpAssignmentAux.newInstance((CtOperatorAssignment) node); + return JOpAssignmentAux.newInstance((CtOperatorAssignment) node, weaver); } - return new JAssignment<>(node); + return new JAssignment<>(node, weaver); } @Override @@ -48,12 +49,12 @@ public CtAssignment getNode() { @Override public AExpression getLhsImpl() { - return (AExpression) CtElement2JoinPoint.convert(node.getAssigned()); + return (AExpression) CtElement2JoinPoint.convert(node.getAssigned(), getWeaverEngine()); } @Override public AExpression getRhsImpl() { - return (AExpression) CtElement2JoinPoint.convert(node.getAssignment()); + return (AExpression) CtElement2JoinPoint.convert(node.getAssignment(), getWeaverEngine()); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JBinaryExpression.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JBinaryExpression.java index 96e8a6d1..d8e4cf07 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JBinaryExpression.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JBinaryExpression.java @@ -16,6 +16,7 @@ import pt.up.fe.specs.util.SpecsLogs; import spoon.reflect.code.BinaryOperatorKind; import spoon.reflect.code.CtBinaryOperator; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ABinaryExpression; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.utils.element.OperatorUtils; @@ -25,13 +26,13 @@ public class JBinaryExpression extends ABinaryExpression { public CtBinaryOperator node; - public JBinaryExpression(CtBinaryOperator expr) { - super(new JExpression<>(expr)); + public JBinaryExpression(CtBinaryOperator expr, JavaWeaver weaver) { + super(new JExpression<>(expr, weaver), weaver); node = expr; } - public static JBinaryExpression newInstance(CtBinaryOperator expr) { - return new JBinaryExpression<>(expr); + public static JBinaryExpression newInstance(CtBinaryOperator expr, JavaWeaver weaver) { + return new JBinaryExpression<>(expr, weaver); } @Override @@ -65,12 +66,12 @@ public AExpression[] getOperandsArrayImpl() { @Override public AExpression getLhsImpl() { - return SelectUtils.expression2JoinPoint(node.getLeftHandOperand()); + return SelectUtils.expression2JoinPoint(node.getLeftHandOperand(), getWeaverEngine()); } @Override public AExpression getRhsImpl() { - return SelectUtils.expression2JoinPoint(node.getRightHandOperand()); + return SelectUtils.expression2JoinPoint(node.getRightHandOperand(), getWeaverEngine()); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JBody.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JBody.java index 7e225565..1c5d7029 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JBody.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JBody.java @@ -16,6 +16,7 @@ import spoon.reflect.code.CtBlock; import spoon.reflect.code.CtCodeSnippetStatement; import spoon.reflect.code.CtStatement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.ABody; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; @@ -28,13 +29,13 @@ public class JBody extends ABody { private final CtBlock node; - private JBody(CtBlock block) { - super(new JStatement(block)); + private JBody(CtBlock block, JavaWeaver weaver) { + super(new JStatement(block, weaver), weaver); node = block; } - public static JBody newInstance(CtBlock block) { - return new JBody<>(block); + public static JBody newInstance(CtBlock block, JavaWeaver weaver) { + return new JBody<>(block, weaver); } @Override @@ -46,26 +47,19 @@ public AJavaWeaverJoinPoint insertImplJBody(String position, String code) { final CtCodeSnippetStatement snippet = SnippetFactory.createSnippetStatement(code, node.getFactory()); switch (Location.valueOf(position.toUpperCase())) { - // case BEFORE: - // node.insertBegin(snippet); - // break; - // case AFTER: - // node.insertEnd(snippet); - // break; - case AROUND: - case REPLACE: - node.getStatements().clear(); - node.addStatement(snippet); - snippet.setParent(node); - break; - default: - throw new RuntimeException( - "Code insertion on a block can only be done around (i.e., complete code replacement)"); + case AROUND: + case REPLACE: + node.getStatements().clear(); + node.addStatement(snippet); + snippet.setParent(node); + break; + default: + throw new RuntimeException( + "Code insertion on a block can only be done around (i.e., complete code replacement)"); } snippet.setParent(node); - return CtElement2JoinPoint.convert(snippet); - // return SelectUtils.node2JoinPoint(snippet, JSnippet::newInstance); + return CtElement2JoinPoint.convert(snippet, getWeaverEngine()); } @Override @@ -100,7 +94,8 @@ public AStatement getLastStmtImpl() { return null; } - return CtElement2JoinPoint.convert(node.getStatement(node.getStatements().size() - 1), AStatement.class); + return CtElement2JoinPoint.convert(node.getStatement(node.getStatements().size() - 1), getWeaverEngine(), + AStatement.class); } private boolean hasStatements() { diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JBreak.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JBreak.java index 11eb6b77..80e79699 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JBreak.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JBreak.java @@ -15,19 +15,20 @@ import spoon.reflect.code.CtBreak; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ABreak; public class JBreak extends ABreak { private CtBreak node; - private JBreak(CtBreak node) { - super(new JStatement(node)); + private JBreak(CtBreak node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JBreak newInstance(CtBreak node) { - return new JBreak(node); + public static JBreak newInstance(CtBreak node, JavaWeaver weaver) { + return new JBreak(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JCall.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JCall.java index 95024694..ec994cb1 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JCall.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JCall.java @@ -13,6 +13,10 @@ package weaver.kadabra.joinpoints; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + import pt.up.fe.specs.util.SpecsLogs; import spoon.reflect.code.CtCodeSnippetExpression; import spoon.reflect.code.CtExpression; @@ -20,7 +24,14 @@ import spoon.reflect.declaration.CtType; import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtTypeReference; -import weaver.kadabra.abstracts.joinpoints.*; +import weaver.kadabra.JavaWeaver; +import weaver.kadabra.abstracts.joinpoints.ACall; +import weaver.kadabra.abstracts.joinpoints.AExpression; +import weaver.kadabra.abstracts.joinpoints.AJoinPoint; +import weaver.kadabra.abstracts.joinpoints.AMethod; +import weaver.kadabra.abstracts.joinpoints.AStatement; +import weaver.kadabra.abstracts.joinpoints.AType; +import weaver.kadabra.abstracts.joinpoints.ATypeReference; import weaver.kadabra.exceptions.JavaWeaverException; import weaver.utils.SpoonUtils; import weaver.utils.weaving.ActionUtils; @@ -29,21 +40,17 @@ import weaver.utils.weaving.converters.CtElement2JoinPoint; import weaver.utils.weaving.converters.CtType2AType; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - public class JCall extends ACall { private final CtInvocation node; - private JCall(CtInvocation call) { - super(new JExpression<>(call)); + private JCall(CtInvocation call, JavaWeaver weaver) { + super(new JExpression<>(call, weaver), weaver); node = call; } - public static JCall newInstance(CtInvocation call) { - return new JCall<>(call); + public static JCall newInstance(CtInvocation call, JavaWeaver weaver) { + return new JCall<>(call, weaver); } /** @@ -52,19 +59,12 @@ public static JCall newInstance(CtInvocation call) { @Override public AJoinPoint getParentImpl() { if (SpoonUtils.isStatementInBlock(node)) { - return new JCallStatement<>(node); + return new JCallStatement<>(node, getWeaverEngine()); } return super.getParentImpl(); } - // @Override - // public List selectBinaryExpr() { - // List> select = SelectUtils.select(node, CtBinaryOperator.class, - // JBinaryExpression::newInstance); - // return select; - // } - @Override public String getNameImpl() { return node.getExecutable().getSimpleName(); @@ -102,18 +102,15 @@ public String getTargetImpl() { @Override public AType getTargetTypeImpl() { - // return String.valueOf(node.getTarget().getType().getQualifiedName()); CtTypeReference type = node.getTarget().getType(); CtType typeDeclaration = type.getTypeDeclaration(); - return CtType2AType.convert(typeDeclaration); + return CtType2AType.convert(typeDeclaration, getWeaverEngine()); } @Override public String getReturnTypeImpl() { var returnType = getReturnTypeJpImpl(); return returnType != null ? returnType.toString() : null; - // return getReturnTypeJpImpl().getCodeImpl(); - // return node.getType().toString(); } @Override @@ -127,7 +124,7 @@ public ATypeReference getReturnTypeJpImpl() { return null; } - return (ATypeReference) CtElement2JoinPoint.convert(declaringType); + return (ATypeReference) CtElement2JoinPoint.convert(declaringType, getWeaverEngine()); } @Override @@ -160,11 +157,6 @@ public CtInvocation getNode() { return node; } - // @Override - // public void insertImpl(String position, String code) { - // ActionUtils.insert(position, code, node, getWeaverProfiler()); - // } - @Override public ACall setTargetImpl(String value) { CtCodeSnippetExpression newTarget = SnippetFactory.snippetExpression(value.toString(), @@ -187,43 +179,6 @@ public ACall setExecutableImpl(AMethod executable) { return this; } - // - // public void defImpl2(String attributeStr, Object value) { - // - // Optional attribute = getTargetAttribute(attributeStr); - // - // switch (attribute.get()) { - // case TARGET: - // // System.out.println("Defining target with " + value); - // CtCodeSnippetExpression newTarget = SnippetFactory.snippetExpression(value.toString(), - // node.getFactory()); - // node.setTarget(newTarget); - // break; - // case EXECUTABLE: - // if (!(value instanceof JMethod)) { - // throw new JavaWeaverException( - // "Definition of attribute " + attributeStr + " expects a join point method"); - // } - // - // @SuppressWarnings("unchecked") - // JMethod method = JMethod.class.cast(value); - // CtExecutableReference reference = method.getNode().getReference(); - // node.setExecutable(reference); - // break; - // default: - // throw new JavaWeaverException("Cannot define attribute " + attributeStr + " of join point call"); - // } - // - // } - // - // private static Optional getTargetAttribute(String attributeStr) { - // Optional attribute = CallAttributes.fromString(attributeStr); - // if (!attribute.isPresent()) { - // throw new JavaWeaverException("The join point call does not contain any attribute named " + attributeStr); - // } - // return attribute; - // } - @Override public ACall cloneImpl(AStatement location, String position) { if (!(location instanceof JStatement)) { @@ -234,14 +189,14 @@ public ACall cloneImpl(AStatement location, String position) { JStatement stat = (JStatement) location; CtInvocation cloned = ActionUtils.cloneElement(node); - ActionUtils.insert(position, cloned, stat.getNode()); - return JCall.newInstance(cloned); + ActionUtils.insert(position, cloned, stat.getNode(), getWeaverEngine()); + return JCall.newInstance(cloned, getWeaverEngine()); } @Override public AExpression[] getArgumentsArrayImpl() { final List exprs = SelectUtils.nodeList2JoinPointList(node.getArguments(), - arg -> JExpression.newInstance(arg)); + arg -> JExpression.newInstance(arg, getWeaverEngine())); return exprs.toArray(size -> new AExpression[size]); } @@ -251,6 +206,6 @@ public AMethod getDeclImpl() { if (decl == null || node.getExecutable().isConstructor()) { return null; } - return CtElement2JoinPoint.convert(decl, AMethod.class); + return CtElement2JoinPoint.convert(decl, getWeaverEngine(), AMethod.class); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JCallStatement.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JCallStatement.java index 1d253746..78f577f7 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JCallStatement.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JCallStatement.java @@ -15,12 +15,14 @@ import spoon.reflect.code.CtInvocation; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ACall; import weaver.kadabra.abstracts.joinpoints.ACallStatement; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; /** - * This is a "synthetic" join point, to emulate statements around single statement calls. + * This is a "synthetic" join point, to emulate statements around single + * statement calls. * * @param * @author JoaoBispo @@ -29,8 +31,8 @@ public class JCallStatement extends ACallStatement { private final CtInvocation call; - public JCallStatement(CtInvocation call) { - super(new JStatement(call)); + public JCallStatement(CtInvocation call, JavaWeaver weaver) { + super(new JStatement(call, weaver), weaver); this.call = call; } @@ -41,7 +43,7 @@ public CtElement getNode() { @Override public ACall getCallImpl() { - return JCall.newInstance(call); + return JCall.newInstance(call, getWeaverEngine()); } @Override @@ -59,8 +61,8 @@ public String getCodeImpl() { } /** - * TODO: This is an example where the getSrcCodeImpl() in AJavaWeaverJoinPoint does not call the overridden - * getCodeImpl() + * TODO: This is an example where the getSrcCodeImpl() in AJavaWeaverJoinPoint + * does not call the overridden getCodeImpl() */ @Override public String getSrcCodeImpl() { diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JCase.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JCase.java index 7c0eb918..78ad956c 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JCase.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JCase.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtCase; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ACase; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.AStatement; @@ -23,13 +24,13 @@ public class JCase extends ACase { private final CtCase node; - private JCase(CtCase node) { - super(new JStatement(node)); + private JCase(CtCase node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JCase newInstance(CtCase node) { - return new JCase<>(node); + public static JCase newInstance(CtCase node, JavaWeaver weaver) { + return new JCase<>(node, weaver); } @Override @@ -44,12 +45,12 @@ public Boolean getIsDefaultImpl() { @Override public AStatement[] getStmtsArrayImpl() { - return CtElement2JoinPoint.convertList(node.getStatements(), AStatement.class); + return CtElement2JoinPoint.convertList(node.getStatements(), getWeaverEngine(), AStatement.class); } @Override public AExpression getExprImpl() { - return CtElement2JoinPoint.convert(node.getCaseExpression(), AExpression.class); + return CtElement2JoinPoint.convert(node.getCaseExpression(), getWeaverEngine(), AExpression.class); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JCatch.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JCatch.java index 89bf1020..2fefac6c 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JCatch.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JCatch.java @@ -2,6 +2,7 @@ import spoon.reflect.code.CtCatch; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ABody; import weaver.kadabra.abstracts.joinpoints.ACatch; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -10,7 +11,8 @@ public class JCatch extends ACatch { private final CtCatch node; - public JCatch(CtCatch node) { + public JCatch(CtCatch node, JavaWeaver weaver) { + super(weaver); this.node = node; } @@ -21,7 +23,7 @@ public CtElement getNode() { @Override public ABody getBodyImpl() { - return CtElement2JoinPoint.convert(node.getBody(), ABody.class); + return CtElement2JoinPoint.convert(node.getBody(), getWeaverEngine(), ABody.class); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JClass.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JClass.java index 1be59ea9..cc23b2df 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JClass.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JClass.java @@ -19,6 +19,7 @@ import spoon.reflect.declaration.*; import spoon.reflect.factory.Factory; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.*; import weaver.utils.generators.FunctionalClassGenerator; import weaver.utils.generators.MapGenerator; @@ -34,9 +35,8 @@ public class JClass extends AClass { private final CtClass originClass; private final CtCompilationUnit parent; - private JClass(CtClass node, CtCompilationUnit parent) { - super(JType.newInstance(node, parent)); - // super(JType.newInstance(node)); + private JClass(CtClass node, CtCompilationUnit parent, JavaWeaver weaver) { + super(JType.newInstance(node, parent, weaver), weaver); this.originClass = node; this.parent = parent; } @@ -46,13 +46,12 @@ public String toString() { return originClass.getQualifiedName(); } - public static JClass newInstance(CtClass node, CtCompilationUnit parent) { - return new JClass<>(node, parent); + public static JClass newInstance(CtClass node, CtCompilationUnit parent, JavaWeaver weaver) { + return new JClass<>(node, parent, weaver); } - public static JClass newInstance(CtClass node) { - - return new JClass<>(node, node.getPosition().getCompilationUnit()); + public static JClass newInstance(CtClass node, JavaWeaver weaver) { + return new JClass<>(node, node.getPosition().getCompilationUnit(), weaver); } @Override @@ -65,7 +64,6 @@ public void insertStaticImpl(String code) { Factory factory = originClass.getFactory(); CtCodeSnippetStatement snippetStmt = SnippetFactory.createSnippetStatement(code, factory); - // CtBlock newBlock = factory.Code().createCtBlock(snippetStmt); CtBlock newBlock = factory.Core().createBlock(); newBlock.addStatement(snippetStmt); CtAnonymousExecutable createAnonymous = factory.Method().createAnonymous(originClass, newBlock); @@ -77,13 +75,13 @@ public AClass mapVersionsImpl(String name, String keyType, AInterfaceType _inter CtClass generate = MapGenerator.generate(originClass.getFactory(), name, keyType, _interface, methodName); originClass.addNestedType(generate); - JClass jClass = new JClass<>(generate, parent); + JClass jClass = new JClass<>(generate, parent, getWeaverEngine()); return jClass; } @Override public AInterfaceType extractInterfaceImpl(String name, String _package, AMethod method, boolean associate, - boolean newFile) { + boolean newFile) { Factory factory = originClass.getFactory(); // First create the interface @@ -110,7 +108,6 @@ public AInterfaceType extractInterfaceImpl(String name, String _package, AMethod parent.getFile().getParentFile(), factory); } else { newInterface = ActionUtils.newInterface(name, null, originClass.getFactory()); - // file.addInterface(new JInterface(newInterface)); } if (associate) { @@ -120,13 +117,14 @@ public AInterfaceType extractInterfaceImpl(String name, String _package, AMethod // Then add the method signature final JMethod jMethod = (JMethod) method; final CtMethod ctMethod = jMethod.getNode(); - // To be replaced in Spoon 5.0 with: create(newInterface, ctMethod, true); newMethod.setBody(null); + // To be replaced in Spoon 5.0 with: create(newInterface, ctMethod, true); + // newMethod.setBody(null); final CtMethod newMethod = copyMethod(newInterface, ctMethod, factory); newMethod.removeModifier(ModifierKind.STATIC); // methods in interfaces are non-static! newMethod.removeModifier(ModifierKind.PRIVATE); // we want this method to be public newMethod.addModifier(ModifierKind.PUBLIC); newMethod.setParent(newInterface); - JInterfaceType newInstance = JInterfaceType.newInstance(newInterface); + JInterfaceType newInstance = JInterfaceType.newInstance(newInterface, getWeaverEngine()); return newInstance; } @@ -146,32 +144,31 @@ public AMethod newFunctionalClassImpl(AMethod interfaceMethod, AMethod generator JMethod gMethod = (JMethod) generatorMethod; CtMethod gMethodNode = gMethod.getNode(); - JMethod jMethod = FunctionalClassGenerator.generate(iMethodNode, gMethodNode, this.originClass); + JMethod jMethod = FunctionalClassGenerator.generate(getWeaverEngine(), iMethodNode, gMethodNode, + this.originClass); return jMethod; } @Override public AConstructor newConstructorImpl(String[] modifiers, String[] paramLeft, String[] paramRight) { CtConstructor newConstructor = ActionUtils.newConstructor(originClass, paramLeft, paramRight, modifiers); - JConstructor newInstance = SelectUtils.node2JoinPoint(newConstructor, JConstructor::newInstance); + JConstructor newInstance = SelectUtils.node2JoinPoint(newConstructor, + (node -> JConstructor.newInstance(node, getWeaverEngine()))); return newInstance; } @Override public AJoinPoint getParentImpl() { var spoonParent = getNode().getParent(); - // System.out.println("Spoon parent: " + spoonParent.getClass()); - // System.out.println("Kadabra parent: " + parent.getClass()); - // System.out.println("IS package? " + (spoonParent instanceof CtPackage)); if (spoonParent != null && !(spoonParent instanceof CtPackage)) { - return CtElement2JoinPoint.convert(spoonParent); + return CtElement2JoinPoint.convert(spoonParent, getWeaverEngine()); } - return new JFile(parent); + return new JFile(parent, getWeaverEngine()); } @Override public Boolean getIsTopLevelImpl() { return originClass.isTopLevel(); } -} \ No newline at end of file +} diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JComment.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JComment.java index a1db0da7..332eb7f3 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JComment.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JComment.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtComment; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AComment; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; @@ -24,13 +25,13 @@ public class JComment extends AComment { private final CtComment comment; - private JComment(CtComment comment) { - super(new JStatement(comment)); + private JComment(CtComment comment, JavaWeaver weaver) { + super(new JStatement(comment, weaver), weaver); this.comment = comment; } - public static JComment newInstance(CtComment comment) { - return new JComment(comment); + public static JComment newInstance(CtComment comment, JavaWeaver weaver) { + return new JComment(comment, weaver); } @Override @@ -54,7 +55,7 @@ public AJoinPoint[] insertImpl(String position, String code) { } public AJavaWeaverJoinPoint insertImplJComment(String position, String code) { - return ActionUtils.insertInTable(comment, code, position); + return ActionUtils.insertInTable(comment, code, position, getWeaverEngine()); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JConstructor.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JConstructor.java index cb3d835c..5a43c85c 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JConstructor.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JConstructor.java @@ -14,36 +14,22 @@ package weaver.kadabra.joinpoints; import spoon.reflect.declaration.CtConstructor; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AConstructor; public class JConstructor extends AConstructor { private final CtConstructor node; - private JConstructor(CtConstructor node) { - super(JExecutable.newInstance(node)); + private JConstructor(CtConstructor node, JavaWeaver weaver) { + super(JExecutable.newInstance(node, weaver), weaver); this.node = node; } - public static JConstructor newInstance(CtConstructor node) { - return new JConstructor<>(node); + public static JConstructor newInstance(CtConstructor node, JavaWeaver weaver) { + return new JConstructor<>(node, weaver); } - // @Override - // public List selectBody() { - // - // CtBlock body = node.getBody(); - // List> node2JoinPointList = SelectUtils.node2JoinPointList(body, JBody::newInstance); - // return node2JoinPointList; - // } - // - // @Override - // public List selectParam() { - // List> parameters = node.getParameters(); - // NodeConverter, JDeclaration> converter = JDeclaration::newInstance; - // return SelectUtils.nodeList2JoinPointList(parameters, converter); - // } - @Override public CtConstructor getNode() { return node; @@ -55,52 +41,6 @@ public String getDeclaratorImpl() { return node.getDeclaringType().getQualifiedName(); } - // @Override - // public AJoinPoint[] insertImpl(String position, String code) { - // return new AJoinPoint[] { insertImplExecutable(position, code) }; - // } - // - // @Override - // public AJoinPoint insertBeforeImpl(String code) { - // return insertImplExecutable("before", code); - // } - - // @Override - // public AJoinPoint[] insertImpl(String position, JoinPoint code) { - // return new AJoinPoint[] { insertImplExecutable(position, (AJoinPoint) code) }; - // } - - // public AJavaWeaverJoinPoint insertImplExecutable(String position, String code) { - // Factory factory = getNode().getFactory(); - // - // var clonedConstructor = node.clone(); - // var constructorClass = getAncestor(CtClass.class); - // constructorClass.addConstructor(clonedConstructor); - // - // var snippetNode = factory.Code() - // - // var params = clonedConstructor.getParameters(); - // var newParams = new ArrayList<>(params); - // newParams.clear(); - // clonedConstructor.setParameters(newParams); - // - // // System.out.println("CODE:'" + code + "'"); - // // var snippetNode = factory.Code() - // // .createCodeSnippetStatement(code).compile(); - // // - // // System.out.println("SNIPPET CLASS: " + snippetNode.getClass()); - // return null; - // // CtKadabraSnippetElement snippet = SnippetFactory.createSnippetElement(factory, code); - // // - // // return ActionUtils.insertMember(node, snippet, position, getWeaverEngine().getWeaverProfiler()); - // } - - // @Override - // public void insertImpl(String position, String code) { - // - // ActionUtils.insertMember(node, code, position, getWeaverProfiler()); - // } - @Override public String toString() { return node.getSignature(); diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JContinue.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JContinue.java index 501e9f41..4ab87bc6 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JContinue.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JContinue.java @@ -15,19 +15,20 @@ import spoon.reflect.code.CtContinue; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AContinue; public class JContinue extends AContinue { private CtContinue node; - private JContinue(CtContinue node) { - super(new JStatement(node)); + private JContinue(CtContinue node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JContinue newInstance(CtContinue node) { - return new JContinue(node); + public static JContinue newInstance(CtContinue node, JavaWeaver weaver) { + return new JContinue(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JDeclaration.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JDeclaration.java index 665cb7dc..32da974b 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JDeclaration.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JDeclaration.java @@ -16,6 +16,7 @@ import spoon.reflect.code.CtExpression; import spoon.reflect.declaration.CtVariable; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ADeclaration; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.ATypeReference; @@ -27,12 +28,13 @@ public class JDeclaration extends ADeclaration { protected CtVariable node; - private JDeclaration(CtVariable node) { + private JDeclaration(CtVariable node, JavaWeaver weaver) { + super(weaver); this.node = node; } - public static JDeclaration newInstance(CtVariable node) { - return new JDeclaration<>(node); + public static JDeclaration newInstance(CtVariable node, JavaWeaver weaver) { + return new JDeclaration<>(node, weaver); } @Override @@ -42,16 +44,8 @@ public String getNameImpl() { @Override public ATypeReference getTypeReferenceImpl() { - CtTypeReference type2 = node.getType(); - return type2 != null ? new JTypeReference<>(type2) : null; - /* - if (type2 == null) { - return "unknown"; - } - String type = CtTypeReferenceUtils.getType(type2); - return type != null ? type : "unknown"; - */ + return type2 != null ? new JTypeReference<>(type2, getWeaverEngine()) : null; } @Override @@ -92,7 +86,7 @@ public AExpression getInitImpl() { return null; } - return (AExpression) CtElement2JoinPoint.convert(init); + return CtElement2JoinPoint.convert(init, getWeaverEngine(), AExpression.class); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JDoWhile.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JDoWhile.java index cb88da7e..c06ae136 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JDoWhile.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JDoWhile.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtDo; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.enums.LoopType; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -22,18 +23,18 @@ public class JDoWhile extends JLoop { CtDo node; - private JDoWhile(CtDo node) { - super(node, LoopType.DOWHILE); + private JDoWhile(CtDo node, JavaWeaver weaver) { + super(node, LoopType.DOWHILE, weaver); this.node = node; } - public static JDoWhile newInstance(CtDo node) { - return new JDoWhile(node); + public static JDoWhile newInstance(CtDo node, JavaWeaver weaver) { + return new JDoWhile(node, weaver); } @Override public AExpression getCondImpl() { - return (AExpression) CtElement2JoinPoint.convert(node.getLoopingExpression()); + return CtElement2JoinPoint.convert(node.getLoopingExpression(), getWeaverEngine(), AExpression.class); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JEnumValue.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JEnumValue.java index 59d95fb4..36af6a7d 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JEnumValue.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JEnumValue.java @@ -2,20 +2,21 @@ import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtEnumValue; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AEnumValue; public class JEnumValue extends AEnumValue { private final CtEnumValue node; - public JEnumValue(CtEnumValue node) { - super(new JField<>(node)); + public JEnumValue(CtEnumValue node, JavaWeaver weaver) { + super(new JField<>(node, weaver), weaver); this.node = node; } - public static JEnumValue newInstance(CtEnumValue field) { - return new JEnumValue<>(field); + public static JEnumValue newInstance(CtEnumValue field, JavaWeaver weaver) { + return new JEnumValue<>(field, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JExecutable.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JExecutable.java index d75fe3bb..63ed9187 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JExecutable.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JExecutable.java @@ -18,6 +18,7 @@ import spoon.reflect.code.CtBlock; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.factory.Factory; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.ABody; import weaver.kadabra.abstracts.joinpoints.ADeclaration; @@ -34,12 +35,13 @@ public class JExecutable extends AExecutable { private CtExecutable node; - private JExecutable(CtExecutable node) { + private JExecutable(CtExecutable node, JavaWeaver weaver) { + super(weaver); this.node = node; } - public static JExecutable newInstance(CtExecutable node) { - return new JExecutable<>(node); + public static JExecutable newInstance(CtExecutable node, JavaWeaver weaver) { + return new JExecutable<>(node, weaver); } @Override @@ -66,7 +68,7 @@ public ABody getBodyImpl() { return null; } - return (ABody) CtElement2JoinPoint.convert(body); + return CtElement2JoinPoint.convert(body, getWeaverEngine(), ABody.class); } @Override @@ -81,13 +83,15 @@ public String toString() { @Override public ADeclaration[] getParamsArrayImpl() { - return SelectUtils.nodeList2JoinPointList(node.getParameters(), JDeclaration::newInstance) + return SelectUtils + .nodeList2JoinPointList(node.getParameters(), + (node -> JDeclaration.newInstance(node, getWeaverEngine()))) .toArray(length -> new ADeclaration[0]); } @Override public ATypeReference getReturnRefImpl() { - return (ATypeReference) CtElement2JoinPoint.convert(node.getType()); + return (ATypeReference) CtElement2JoinPoint.convert(node.getType(), getWeaverEngine()); } @Override @@ -103,19 +107,13 @@ public AJoinPoint[] insertImpl(String position, JoinPoint code) { public AJavaWeaverJoinPoint insertImplExecutable(String position, String code) { Factory factory = getNode().getFactory(); - // System.out.println("CODE:'" + code + "'"); - // var snippetNode = factory.Code() - // .createCodeSnippetStatement(code).compile(); - // - // System.out.println("SNIPPET CLASS: " + snippetNode.getClass()); - CtKadabraSnippetElement snippet = SnippetFactory.createSnippetElement(factory, code); - return ActionUtils.insertMember(node, snippet, position); + return ActionUtils.insertMember(node, snippet, position, getWeaverEngine()); } public AJavaWeaverJoinPoint insertImplExecutable(String position, AJoinPoint code) { - return ActionUtils.insertMember(node, code.getNode(), position); + return ActionUtils.insertMember(node, code.getNode(), position, getWeaverEngine()); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JExpression.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JExpression.java index df1ffd66..a93bf504 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JExpression.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JExpression.java @@ -15,6 +15,7 @@ import org.lara.interpreter.weaver.interf.JoinPoint; import spoon.reflect.code.*; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.*; import weaver.kadabra.exceptions.JavaWeaverException; @@ -30,7 +31,8 @@ public class JExpression extends AExpression { CtExpression node; Integer test = 10; - public JExpression(CtExpression expr) { + public JExpression(CtExpression expr, JavaWeaver weaver) { + super(weaver); node = expr; } @@ -44,21 +46,12 @@ public String toString() { return super.toString() + " - " + node.getClass().getSimpleName(); } - public static AExpression newInstanceDefault(CtExpression expr) { - return new JExpression<>(expr); + public static AExpression newInstanceDefault(CtExpression expr, JavaWeaver weaver) { + return new JExpression<>(expr, weaver); } - public static AExpression newInstance(CtExpression expr) { - return CtExpression2AExpression.convertToExpression(expr); - // if (expr instanceof CtBinaryOperator) { - // return JBinaryExpression.newInstance((CtBinaryOperator) expr); - // } - // - // if (expr instanceof CtInvocation) { - // return JCall.newInstance((CtInvocation) expr); - // } - - // return new JExpression<>(expr); + public static AExpression newInstance(CtExpression expr, JavaWeaver weaver) { + return CtExpression2AExpression.convertToExpression(expr, weaver); } @Override @@ -85,32 +78,19 @@ public ATypeReference getTypeReferenceImpl() { // First child should be a TypeReference if (firstChild instanceof ATypeReference) { return (ATypeReference) firstChild; - // return new JTypeReference<>((CtTypeReference) firstChild); } } - // if (getNumChildrenImpl() > 0) { - // var firstChild = getChildrenNodes().get(0); - // // First child should be a TypeReference - // if (firstChild instanceof CtTypeReference) { - // return new JTypeReference<>((CtTypeReference) firstChild); - // } - // } - // Fallback var type = node.getType(); - // System.out.println("FIRST CHILD: " + firstChild); - // System.out.println("TYPE: " + type); - if (type == null) { KadabraLog.info("Currrent expression, of join point type '" + getJoinPointType() + "', does not have a type defined: '" + getCodeImpl() + "'"); return null; } - return new JTypeReference<>(type); - // return type.toString(); + return new JTypeReference<>(type, getWeaverEngine()); } @Override @@ -120,8 +100,6 @@ public String getTypeImpl() { } catch (Exception e) { return null; } - // var typeReference = getTypeReferenceImpl(); - // return typeReference != null ? typeReference.toString() : null; } @Override @@ -143,7 +121,7 @@ public void extractImpl(String varName, AStatement location, String position) { throw new JavaWeaverException("Could not get the target location"); } - targetO.ifPresent(t -> SpoonUtils.extract(node, varName, t, position)); + targetO.ifPresent(t -> SpoonUtils.extract(node, varName, t, position, getWeaverEngine())); } private Optional getTarget(AStatement location) { @@ -166,34 +144,22 @@ public CtExpression getNode() { @Override public AJoinPoint[] insertImpl(String position, String code) { - return new AJoinPoint[]{insertImplJExpression(position, code)}; + return new AJoinPoint[] { insertImplJExpression(position, code) }; } public AJavaWeaverJoinPoint insertImplJExpression(String position, String code) { if (position.equals("replace") || position.equals("around")) { - return ActionUtils.replaceExpression(position, code, node); + return ActionUtils.replaceExpression(position, code, node, getWeaverEngine()); } else { - return ActionUtils.insert(position, code, node); + return ActionUtils.insert(position, code, node, getWeaverEngine()); } } @Override public AJoinPoint[] insertImpl(String position, JoinPoint JoinPoint) { - return new AJoinPoint[]{insertImplJExpression(position, (AJavaWeaverJoinPoint) JoinPoint)}; + return new AJoinPoint[] { insertImplJExpression(position, (AJavaWeaverJoinPoint) JoinPoint) }; } - // @Override - // public AJoinPoint[] insertImpl(String position, U JoinPoint) { - // return new AJoinPoint[] { insertImplJExpression(position, (AJavaWeaverJoinPoint) JoinPoint) }; - // }; - - // @Override - // public JoinPoint[] insertImpl( - // String position, U JoinPoint) { - // System.out.println("HELLOO!!!"); - // return null; - // }; - public AJavaWeaverJoinPoint insertImplJExpression(String position, AJavaWeaverJoinPoint joinPoint) { var ctElement = joinPoint.getNode(); @@ -206,9 +172,9 @@ public AJavaWeaverJoinPoint insertImplJExpression(String position, AJavaWeaverJo CtExpression expression = (CtExpression) ctElement; - return ActionUtils.replaceExpression(position, expression, node); + return ActionUtils.replaceExpression(position, expression, node, getWeaverEngine()); } else { - return ActionUtils.insert(position, ctElement, node); + return ActionUtils.insert(position, ctElement, node, getWeaverEngine()); } } @@ -226,15 +192,4 @@ public AJoinPoint insertAfterImpl(String code) { public AJoinPoint insertReplaceImpl(String code) { return insertImplJExpression("replace", code); } - - // @Override - // public String toString() { - // return super.toString() + " - " + getNode().getClass().getSimpleName(); - // } - - // @Override - // public AJoinPoint copyImpl() { - // return CtElement2JoinPoint.convert(SnippetFactory.createSnippetExpression(node.getFactory(), getSrcCodeImpl())); - // } - } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JExpressionStatement.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JExpressionStatement.java index 6d1d687e..64d9ba60 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JExpressionStatement.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JExpressionStatement.java @@ -14,22 +14,23 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtStatement; +import weaver.kadabra.JavaWeaver; /** - * This class encapsulates expressions that can also be a statement, such as Invocations (JCall/CtInvocation) and - * Assignemnt (JAssignment/CtAssignment). - * + * This class encapsulates expressions that can also be a statement, such as + * Invocations (JCall/CtInvocation) and Assignment (JAssignment/CtAssignment). + * * @author tiago * */ public class JExpressionStatement extends JStatement { - public JExpressionStatement(CtStatement node) { - super(node); + public JExpressionStatement(CtStatement node, JavaWeaver weaver) { + super(node, weaver); } - public static JExpressionStatement newInstance(CtStatement node) { - return new JExpressionStatement(node); + public static JExpressionStatement newInstance(CtStatement node, JavaWeaver weaver) { + return new JExpressionStatement(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JField.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JField.java index 060afbfe..051b919e 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JField.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JField.java @@ -17,6 +17,7 @@ import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtField; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AField; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; @@ -26,14 +27,13 @@ public class JField extends AField { private final CtField node; - JField(CtField field) { - super(JDeclaration.newInstance(field)); + JField(CtField field, JavaWeaver weaver) { + super(JDeclaration.newInstance(field, weaver), weaver); node = field; - } - public static JField newInstance(CtField field) { - return new JField<>(field); + public static JField newInstance(CtField field, JavaWeaver weaver) { + return new JField<>(field, weaver); } @Override @@ -46,12 +46,6 @@ public String getDeclaratorImpl() { return node.getDeclaringType().getQualifiedName(); } - // @Override - // public void initImpl(String value) { - // CtCodeSnippetExpression snippetExpression = SnippetFactory.snippetExpression(value, node.getFactory()); - // node.setDefaultExpression(snippetExpression); - // } - @Override public AJoinPoint[] insertImpl(String position, JoinPoint code) { return new AJoinPoint[] { insertImplJField(position, (CtElement) code.getNode()) }; @@ -63,11 +57,11 @@ public AJoinPoint[] insertImpl(String position, String code) { } public AJavaWeaverJoinPoint insertImplJField(String position, CtElement code) { - return ActionUtils.insertMember(node, code, position); + return ActionUtils.insertMember(node, code, position, getWeaverEngine()); } public AJavaWeaverJoinPoint insertImplJField(String position, String code) { - return ActionUtils.insertMember(node, code, position); + return ActionUtils.insertMember(node, code, position, getWeaverEngine()); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JFieldAccess.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JFieldAccess.java index fcf577a7..897462a3 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JFieldAccess.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JFieldAccess.java @@ -16,6 +16,7 @@ import spoon.reflect.code.CtFieldAccess; import spoon.reflect.declaration.CtElement; import weaver.kadabra.abstracts.joinpoints.AExpression; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AFieldAccess; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -23,13 +24,13 @@ public class JFieldAccess extends AFieldAccess { private final CtFieldAccess node; - protected JFieldAccess(CtFieldAccess var) { - super(new JVar<>(var)); + protected JFieldAccess(CtFieldAccess var, JavaWeaver weaver) { + super(new JVar<>(var, weaver), weaver); node = var; } - public static JFieldAccess newInstance(CtFieldAccess var) { - return new JFieldAccess<>(var); + public static JFieldAccess newInstance(CtFieldAccess var, JavaWeaver weaver) { + return new JFieldAccess<>(var, weaver); } @Override @@ -39,27 +40,6 @@ public CtElement getNode() { @Override public AExpression getBaseImpl() { - return CtElement2JoinPoint.convert(node.getTarget(), AExpression.class); + return CtElement2JoinPoint.convert(node.getTarget(), getWeaverEngine(), AExpression.class); } - - // @Override - // public String[] getModifiersArrayImpl() { - // var decl = getDeclarationImpl(); - // if (decl == null) { - // return new String[0]; - // } - // - // return JoinPoints.getModifiersInternal(decl).stream() - // .map(ModifierKind::name) - // .toArray(length -> new String[length]); - // } - - // @Override - // public Boolean getIsFinalImpl() { - // System.out.println("Get modifiers attribute: " + Arrays.asList(getModifiersArrayImpl())); - // System.out.println("Get modifiers internal: " + getModifiersInternal()); - // return super.getIsFinalImpl(); - // // return getModifiersInternal().contains(ModifierKind.FINAL); - // } - } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JFile.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JFile.java index 328ed3d6..b0f13333 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JFile.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JFile.java @@ -21,6 +21,7 @@ import spoon.support.reflect.declaration.CtImportImpl; import spoon.support.reflect.reference.CtTypeReferenceImpl; import spoon.support.visitor.equals.EqualsVisitor; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.*; import weaver.utils.generators.MapGenerator; @@ -35,63 +36,23 @@ public class JFile extends AFile { private final CtCompilationUnit node; - public JFile(CtCompilationUnit node) { + public JFile(CtCompilationUnit node, JavaWeaver weaver) { + super(weaver); this.node = node; } - // public JFile(CtKadabraCompilationUnit node) { - // this.node = node.getCu(); - // } - - // @Override - // public String getCodeImpl() { - // return node.toString(); - // } - @Override public void addImportImpl(String qualifiedName) { var imports = node.getImports(); - // System.out.println("IMPORTS BEFORE:\n" + imports); var packageReferece = new CtTypeReferenceImpl(); packageReferece.setSimpleName(qualifiedName); - // System.out.println("Reference:" + packageReferece); var newImport = new CtImportImpl().setReference(packageReferece); - // System.out.println("NEW IMPORT: " + newImport); imports.add(newImport); node.setImports(new ArrayList<>(imports)); - // System.out.println("IMPORTS AFTER:\n" + node.getImports()); } - /* - @Override - public void addImportImpl(String qualifiedName) { - var importList = node.getImports(); - // Add to a set, keeping order - var updatedSet = new LinkedHashSet<>(importList); - - // CtImportImpl - var ref = new CtTypeReferenceImpl<>(); - ref.setSimpleName(qualifiedName); - var newImport = new CtImportImpl(); - newImport.setReference(ref); - updatedSet.add(newImport); - node.setImports(updatedSet); - - // // If new import, replace - // if (updatedSet.add(newImport)) { - // node.setImports(updatedSet); - // } - - // ref.setPackage(new CtPackageReferenceImpl()) - // System.out.println("REF: " + ref); - // ref.setSimpleName(qualifiedName); - // TODO Auto-generated method stub - // super.addImportImpl(qualifiedName); - } - */ - @Override public boolean compareNodes(AJoinPoint aJoinPoint) { @@ -109,7 +70,7 @@ public boolean compareNodes(AJoinPoint aJoinPoint) { List> others = other.getDeclaredTypes(); for (Iterator firstIt = elements.iterator(), secondIt = others.iterator(); (firstIt - .hasNext()) && (secondIt.hasNext()); ) { + .hasNext()) && (secondIt.hasNext());) { boolean isNotEqual = EqualsVisitor.equals(firstIt.next(), secondIt.next()); if (isNotEqual) { return false; @@ -182,19 +143,11 @@ private Stream> streamOfTypes() { return node.getDeclaredTypes().stream(); } - // @Override - // public void addImportImpl(String _class) { - // // System.out.println("for file: " + getName() + " importing: " + _class); - // CtTypeReference reference = node.getFactory().Class().get(_class).getReference(); - // Import newImport = node.getFactory().CompilationUnit().createImport(reference); - // ((CompilationUnitImpl) node).getManualImports().add(newImport); - // } - @Override public AClass newClassImpl(String name, String extend, String[] implement) { final CtClass newClass = ActionUtils.newClass(name, extend, implement, node.getFactory()); node.getDeclaredTypes().add(newClass); - JClass newInstance = JClass.newInstance(newClass, node); + JClass newInstance = JClass.newInstance(newClass, node, getWeaverEngine()); return newInstance; } @@ -207,7 +160,7 @@ public AClass newClassImpl(String name) { public AInterfaceType newInterfaceImpl(String name, String[] extend) { final CtInterface newInterface = ActionUtils.newInterface(name, extend, node.getFactory()); node.getDeclaredTypes().add(newInterface); - JInterfaceType newInstance = JInterfaceType.newInstance(newInterface); + JInterfaceType newInstance = JInterfaceType.newInstance(newInterface, getWeaverEngine()); return newInstance; } @@ -240,7 +193,7 @@ public AClass mapVersionsImpl(String name, String keyType, AInterfaceType _inter CtClass newClass = MapGenerator.generate(node.getFactory(), name, keyType, _interface, methodName); node.getDeclaredTypes().add(newClass); - AClass newInstance = JClass.newInstance(newClass, node); + AClass newInstance = JClass.newInstance(newClass, node, getWeaverEngine()); return newInstance; } @@ -254,7 +207,7 @@ public AJoinPoint[] getChildrenArrayImpl() { List children = new ArrayList<>(); for (var file : getNode().getDeclaredTypes()) { - AJavaWeaverJoinPoint type = CtElement2JoinPoint.convertTry(file).orElse(null); + AJavaWeaverJoinPoint type = CtElement2JoinPoint.convertTry(file, getWeaverEngine()).orElse(null); if (type == null) { continue; } @@ -265,16 +218,6 @@ public AJoinPoint[] getChildrenArrayImpl() { return children.toArray(new AJoinPoint[0]); } - // @Override - // public AJoinPoint childImpl(Integer index) { - // return getChildrenArrayImpl()[index]; - // } - - // @Override - // public Integer getNumChildrenImpl() { - // return getChildrenArrayImpl().length; - // } - @Override public String toString() { return getNameImpl(); @@ -293,16 +236,17 @@ public AType getMainClassImpl() { return null; } - // Name of file can be empty, in that case just return the first type if present, otherwise throw exception + // Name of file can be empty, in that case just return the first type if + // present, otherwise throw exception if (fileName.isBlank()) { SpecsLogs.info("file.mainClass: file name is empty, returning first class that is found in file"); - return CtElement2JoinPoint.convert(declaredTypes.get(0), AType.class); + return CtElement2JoinPoint.convert(declaredTypes.get(0), getWeaverEngine(), AType.class); } var declaredTypesNames = new ArrayList(); for (var declaredType : declaredTypes) { if (fileName.equals(declaredType.getSimpleName())) { - return CtElement2JoinPoint.convert(declaredType, AType.class); + return CtElement2JoinPoint.convert(declaredType, getWeaverEngine(), AType.class); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JFor.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JFor.java index 868fd3a0..4ecfb298 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JFor.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JFor.java @@ -22,6 +22,7 @@ import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtField; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.AField; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; @@ -37,13 +38,13 @@ public class JFor extends JLoop { CtFor node; - private JFor(CtFor node) { - super(node, LoopType.FOR); + private JFor(CtFor node, JavaWeaver weaver) { + super(node, LoopType.FOR, weaver); this.node = node; } - public static JFor newInstance(CtFor node) { - return new JFor(node); + public static JFor newInstance(CtFor node, JavaWeaver weaver) { + return new JFor(node, weaver); } @Override @@ -82,7 +83,7 @@ public AField tileImpl(String tileName, String block, boolean unique, AJoinPoint } // invalidate current rank rank = null; - JField newInstance = JField.newInstance(tileField); + JField newInstance = JField.newInstance(tileField, getWeaverEngine()); return newInstance; } @@ -92,15 +93,9 @@ public void tileImpl(int block) { } - // @Override - // public List selectCond() { - // return SelectUtils.expression2JoinPointList(node.getExpression()); - // - // } - @Override public AExpression getCondImpl() { - return (AExpression) CtElement2JoinPoint.convert(node.getExpression()); + return (AExpression) CtElement2JoinPoint.convert(node.getExpression(), getWeaverEngine()); } /** diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JForEach.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JForEach.java index 3e3b846b..9a2656b6 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JForEach.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JForEach.java @@ -15,6 +15,7 @@ import pt.up.fe.specs.util.SpecsLogs; import spoon.reflect.code.CtForEach; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.enums.LoopType; @@ -22,13 +23,13 @@ public class JForEach extends JLoop { CtForEach node; - private JForEach(CtForEach node) { - super(node, LoopType.FOREACH); + private JForEach(CtForEach node, JavaWeaver weaver) { + super(node, LoopType.FOREACH, weaver); this.node = node; } - public static JForEach newInstance(CtForEach node) { - return new JForEach(node); + public static JForEach newInstance(CtForEach node, JavaWeaver weaver) { + return new JForEach(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JGenericJoinPoint.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JGenericJoinPoint.java index 6e215c0d..22ad1766 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JGenericJoinPoint.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JGenericJoinPoint.java @@ -14,21 +14,23 @@ package weaver.kadabra.joinpoints; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; public class JGenericJoinPoint extends AJavaWeaverJoinPoint { private CtElement node; - public static JGenericJoinPoint newDummy() { - return new JGenericJoinPoint(null); + public static JGenericJoinPoint newDummy(JavaWeaver weaver) { + return new JGenericJoinPoint(null, weaver); } - public static JGenericJoinPoint newInstance(CtElement node) { - return new JGenericJoinPoint(node); + public static JGenericJoinPoint newInstance(CtElement node, JavaWeaver weaver) { + return new JGenericJoinPoint(node, weaver); } - public JGenericJoinPoint(CtElement node) { + public JGenericJoinPoint(CtElement node, JavaWeaver weaver) { + super(weaver); this.node = node; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JIf.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JIf.java index 8dbb5b65..bd46660a 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JIf.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JIf.java @@ -20,6 +20,7 @@ import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtElement; import tdrc.utils.StringUtils; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ABody; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.AIf; @@ -33,25 +34,15 @@ public class JIf extends AIf { private final CtIf node; private String rank; - private JIf(CtIf node) { - super(new JStatement(node)); + private JIf(CtIf node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JIf newInstance(CtIf node) { - return new JIf(node); + public static JIf newInstance(CtIf node, JavaWeaver weaver) { + return new JIf(node, weaver); } - // @Override - // public int getLine() { - // return node.getPosition().getLine(); - // } - // - // @Override - // public int getEndLine() { - // return node.getPosition().getEndLine(); - // } - @Override public String getRankImpl() { if (rank != null) { @@ -70,7 +61,7 @@ public CtIf getNode() { @Override public AExpression getCondImpl() { - return (AExpression) CtElement2JoinPoint.convert(node.getCondition()); + return (AExpression) CtElement2JoinPoint.convert(node.getCondition(), getWeaverEngine()); } @Override @@ -84,7 +75,7 @@ public ABody getThenImpl() { throw new JavaWeaverException("The then statement must always be a block"); } - return (ABody) CtElement2JoinPoint.convert(thenStatement); + return (ABody) CtElement2JoinPoint.convert(thenStatement, getWeaverEngine()); } @Override @@ -99,7 +90,7 @@ public ABody getElseImpl() { throw new JavaWeaverException("The else statement must always be a block"); } - return (ABody) CtElement2JoinPoint.convert(elseStatement); + return (ABody) CtElement2JoinPoint.convert(elseStatement, getWeaverEngine()); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JInterfaceType.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JInterfaceType.java index 854bc38d..76d2661e 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JInterfaceType.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JInterfaceType.java @@ -15,23 +15,24 @@ import spoon.reflect.cu.CompilationUnit; import spoon.reflect.declaration.CtInterface; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AInterfaceType; public class JInterfaceType extends AInterfaceType { CtInterface node; - private JInterfaceType(CtInterface node, CompilationUnit parent) { - super(JType.newInstance(node, parent)); + private JInterfaceType(CtInterface node, CompilationUnit parent, JavaWeaver weaver) { + super(JType.newInstance(node, parent, weaver), weaver); this.node = node; } - public static JInterfaceType newInstance(CtInterface node, CompilationUnit parent) { - return new JInterfaceType<>(node, parent); + public static JInterfaceType newInstance(CtInterface node, CompilationUnit parent, JavaWeaver weaver) { + return new JInterfaceType<>(node, parent, weaver); } - public static JInterfaceType newInstance(CtInterface node) { - return new JInterfaceType<>(node, node.getPosition().getCompilationUnit()); + public static JInterfaceType newInstance(CtInterface node, JavaWeaver weaver) { + return new JInterfaceType<>(node, node.getPosition().getCompilationUnit(), weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JLibClass.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JLibClass.java index 3feb7b7c..da8e8acf 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JLibClass.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JLibClass.java @@ -16,55 +16,22 @@ import com.google.common.reflect.ClassPath.ClassInfo; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ALibClass; public class JLibClass extends ALibClass { - // private ClassInfo info; - // private Class libClass; - - private JLibClass(ClassInfo info) { - super(JNamedType.newInstance(info)); + private JLibClass(ClassInfo info, JavaWeaver weaver) { + super(JNamedType.newInstance(info, weaver), weaver); // this.info = info; } - public static JLibClass newInstance(ClassInfo info) { - return new JLibClass(info); + public static JLibClass newInstance(ClassInfo info, JavaWeaver weaver) { + return new JLibClass(info, weaver); } @Override public CtElement getNode() { - return null; } - - /* - @Override - public List selectLibMethod() { - Class libClass = getLibClass(); - if (libClass != null) { - try { - Method[] methods = libClass.getDeclaredMethods(); - List jMethods = Arrays.stream(methods).map(JLibMethod::newInstance) - .collect(Collectors.toList()); - return jMethods; - } catch (Throwable e) { - KadabraLog.warning("Failed to load methods from class " + info.getName() + ": " + e.getMessage()); - } - } - return Collections.emptyList(); - } - - private Class getLibClass() { - if (libClass == null) { - try { - libClass = info.load(); - } catch (Throwable e) { - KadabraLog.warning("Failed to load class " + info.getName() + ": " + e.getMessage()); - } - } - return libClass; - } - */ - } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JLibMethod.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JLibMethod.java index c2e0371c..bad79e25 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JLibMethod.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JLibMethod.java @@ -15,6 +15,7 @@ import java.lang.reflect.Method; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ALibMethod; import weaver.kadabra.abstracts.joinpoints.ANamedType; import weaver.kadabra.exceptions.JavaWeaverException; @@ -23,12 +24,13 @@ public class JLibMethod extends ALibMethod { private Method method; - private JLibMethod(Method m) { + private JLibMethod(Method m, JavaWeaver weaver) { + super(weaver); method = m; } - public static JLibMethod newInstance(Method m) { - return new JLibMethod(m); + public static JLibMethod newInstance(Method m, JavaWeaver weaver) { + return new JLibMethod(m, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JLiteral.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JLiteral.java index 031040a6..c2dec45d 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JLiteral.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JLiteral.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtLiteral; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ALiteral; import weaver.utils.SpoonLiterals; @@ -21,15 +22,13 @@ public class JLiteral extends ALiteral { private CtLiteral node; - private JLiteral(CtLiteral node) { - super(new JExpression<>(node)); + private JLiteral(CtLiteral node, JavaWeaver weaver) { + super(new JExpression<>(node, weaver), weaver); this.node = node; - // System.out.println("VALUE TYPE: " + node.getValue().getClass()); - // System.out.println("TYPE:" + getTypeImpl()); } - public static JLiteral newInstance(CtLiteral node) { - return new JLiteral<>(node); + public static JLiteral newInstance(CtLiteral node, JavaWeaver weaver) { + return new JLiteral<>(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JLocalVariable.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JLocalVariable.java index 82a85b37..9864efc1 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JLocalVariable.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JLocalVariable.java @@ -15,6 +15,7 @@ import spoon.reflect.code.CtExpression; import spoon.reflect.code.CtLocalVariable; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.ALocalVariable; import weaver.kadabra.abstracts.joinpoints.ATypeReference; @@ -25,14 +26,14 @@ public class JLocalVariable extends ALocalVariable { private CtLocalVariable node; private JDeclaration declaration; - private JLocalVariable(CtLocalVariable statement) { - super(new JStatement(statement)); + private JLocalVariable(CtLocalVariable statement, JavaWeaver weaver) { + super(new JStatement(statement, weaver), weaver); this.node = statement; - this.declaration = JDeclaration.newInstance(statement); + this.declaration = JDeclaration.newInstance(statement, weaver); } - public static JLocalVariable newInstance(CtLocalVariable statement) { - return new JLocalVariable<>(statement); + public static JLocalVariable newInstance(CtLocalVariable statement, JavaWeaver weaver) { + return new JLocalVariable<>(statement, weaver); } @Override @@ -50,15 +51,6 @@ public String getTypeImpl() { return getTypeReferenceImpl().toString(); } - // @Override - // public AType getTypeJpImpl() { - // var typeRef = (CtVariable) declaration.getTypeReferenceImpl().getNode(); - // JType() - // typeRef.getType().getTypeDeclaration() - // // TODO Auto-generated method stub - // return null; - // } - @Override public Boolean getIsArrayImpl() { return declaration.getIsArrayImpl(); @@ -86,7 +78,7 @@ public AExpression getInitImpl() { return null; } - return (AExpression) CtElement2JoinPoint.convert(defaultExpr); + return (AExpression) CtElement2JoinPoint.convert(defaultExpr, getWeaverEngine()); } @SuppressWarnings("unchecked") diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JLoop.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JLoop.java index eecbe908..4db27889 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JLoop.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JLoop.java @@ -28,6 +28,7 @@ import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtExecutable; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; import weaver.kadabra.abstracts.joinpoints.ALoop; @@ -45,28 +46,28 @@ public abstract class JLoop extends ALoop { private Integer nestedLevel; protected String rank; - public static JLoop newInstance(CtLoop node) { + public static JLoop newInstance(CtLoop node, JavaWeaver weaver) { SpoonUtils.sanitizeBody(node); if (node instanceof CtFor) { - return JFor.newInstance((CtFor) node); + return JFor.newInstance((CtFor) node, weaver); } else if (node instanceof CtWhile) { - return JWhile.newInstance((CtWhile) node); + return JWhile.newInstance((CtWhile) node, weaver); } else if (node instanceof CtDo) { - return JDoWhile.newInstance((CtDo) node); + return JDoWhile.newInstance((CtDo) node, weaver); } else if (node instanceof CtForEach) { - return JForEach.newInstance((CtForEach) node); + return JForEach.newInstance((CtForEach) node, weaver); } throw new RuntimeException("Type of for loop not yet implemented: " + node.getClass()); } - protected JLoop(CtLoop node, LoopType type) { - super(new JStatement(node)); + protected JLoop(CtLoop node, LoopType type, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; this.type = type; nestedLevel = null; @@ -81,11 +82,11 @@ public AJoinPoint[] insertImpl(String position, String code) { @Override public AJoinPoint[] insertImpl(String position, JoinPoint code) { return new AJoinPoint[] { - ActionUtils.insert(position, (CtElement) code.getNode(), node) }; + ActionUtils.insert(position, (CtElement) code.getNode(), node, getWeaverEngine()) }; } public AJavaWeaverJoinPoint insertImplJLoop(String position, String code) { - return ActionUtils.insert(position, code, node); + return ActionUtils.insert(position, code, node, getWeaverEngine()); } @Override @@ -161,15 +162,4 @@ public String getControlVarImpl() { KadabraLog.warning("Control variable can only be retrieved from 'for' loops"); return null; } - - // @Override - // public int getLine() { - // - // return node.getPosition().getLine(); - // } - // - // @Override - // public int getEndLine() { - // return node.getPosition().getEndLine(); - // } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JMethod.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JMethod.java index 7b58a21c..4e46c57e 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JMethod.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JMethod.java @@ -23,6 +23,7 @@ import spoon.reflect.declaration.CtType; import spoon.reflect.declaration.ModifierKind; import spoon.reflect.factory.Factory; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AClass; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; @@ -39,22 +40,23 @@ public class JMethod extends AMethod { private final CtMethod node; - private JMethod(CtMethod node) { - super(JExecutable.newInstance(node)); + private JMethod(CtMethod node, JavaWeaver weaver) { + super(JExecutable.newInstance(node, weaver), weaver); this.node = node; } - public static JMethod newInstance(CtMethod node) { - return new JMethod<>(node); + public static JMethod newInstance(CtMethod node, JavaWeaver weaver) { + return new JMethod<>(node, weaver); } @Override public AJoinPoint copyImpl() { var methodName = getNameImpl(); var copy = Refactoring.copyMethod(node); - // Refactor method changes the name of the method, appends copy at the end. Restore original name + // Refactor method changes the name of the method, appends copy at the end. + // Restore original name copy.setSimpleName(methodName); - return CtElement2JoinPoint.convert(copy); + return CtElement2JoinPoint.convert(copy, getWeaverEngine()); } @Override @@ -67,22 +69,6 @@ public CtMethod getNode() { return node; } - // @Override - // public Set getModifiersInternal() { - // return node.getModifiers(); - // } - - // @Override - // public String[] getModifiersArrayImpl() { - // return modifiersToString(node.getModifiers()); - // // return super.getModifiersArrayImpl(); - // } - - // @Override - // public Boolean getIsStaticImpl() { - // return node.getModifiers().contains(ModifierKind.STATIC); - // } - @Override public String getToReferenceImpl() { @@ -105,7 +91,7 @@ public JMethod cloneImpl(String newName) { } clone.setSimpleName(newName); ancestor.addMethod(clone); - JMethod newInstance = JMethod.newInstance(clone); + JMethod newInstance = JMethod.newInstance(clone, getWeaverEngine()); return newInstance; } @@ -137,7 +123,7 @@ public AClass createAdapterImpl(AMethod adaptMethod, String name) { public AClass createAdapterImpl(AMethod adaptMethod, String name, boolean reuseIfExists) { JMethod jMethod = (JMethod) adaptMethod; CtMethod adaptMethodNode = jMethod.getNode(); - JClass jClass = AdapterGenerator.generate(name, adaptMethodNode, node, reuseIfExists); + JClass jClass = AdapterGenerator.generate(getWeaverEngine(), name, adaptMethodNode, node, reuseIfExists); return jClass; } @@ -146,13 +132,6 @@ public String getDeclaratorImpl() { return node.getDeclaringType().getQualifiedName(); } - // @Override - // public void defImpl(String attribute, Object value) { - // if (attribute.equals("privacy")) { - // node.addModifier(ModifierKind.valueOf(value.toString())); - // } - // throw new RuntimeException("The attribute '" + attribute + "' is not available for def action"); - // } @Override public String getPrivacyImpl() { Set modifiers = node.getModifiers(); @@ -185,14 +164,13 @@ public AJoinPoint[] insertImpl(String position, JoinPoint code) { public AJavaWeaverJoinPoint insertImplJMethod(String position, String code) { Factory factory = getNode().getFactory(); - // CtCodeSnippetStatement snippet = SnippetFactory.createSnippetStatement(code, factory); CtKadabraSnippetElement snippet = SnippetFactory.createSnippetElement(factory, code); - return ActionUtils.insertMember(node, snippet, position); + return ActionUtils.insertMember(node, snippet, position, getWeaverEngine()); } public AJavaWeaverJoinPoint insertImplJMethod(String position, AJoinPoint code) { - return ActionUtils.insertMember(node, code.getNode(), position); + return ActionUtils.insertMember(node, code.getNode(), position, getWeaverEngine()); } @Override @@ -219,26 +197,4 @@ public AJoinPoint insertReplaceImpl(AJoinPoint jp) { public Boolean isOverridingImpl(AMethod method) { return node.isOverriding((CtMethod) method.getNode()); } - - /*// Old insertImpl - CtKadabraSnippetElement snippet = SnippetFactory.createSnippetElement(factory, code); - SourcePosition pos2 = node.getPosition(); - - // snippet.setPosition(position2); - if (pos2 != null) { - KadabraSourcePosition newPosition = new KadabraSourcePosition(pos2); - if (position.equals("AFTER")) { - newPosition.setLine(newPosition.getLine() + 1); - newPosition.setColumn(newPosition.getColumn() - (counter++)); // FIXME - } - snippet.setPosition(newPosition); - } - ancestor.addNestedType(snippet); - if (position.equals("REPLACE") || position.equals("AROUND")) { - - ancestor.removeMethod(node); - } - */ - - // private static int counter = 0; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JNamedType.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JNamedType.java index fdce2946..0eacb096 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JNamedType.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JNamedType.java @@ -18,6 +18,7 @@ import com.google.common.reflect.ClassPath.ClassInfo; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ANamedType; public class JNamedType extends ANamedType { @@ -25,12 +26,13 @@ public class JNamedType extends ANamedType { private ClassInfo info; private Class libClass; - private JNamedType(ClassInfo info) { + private JNamedType(ClassInfo info, JavaWeaver weaver) { + super(weaver); this.info = info; } - public static JNamedType newInstance(ClassInfo info) { - return new JNamedType(info); + public static JNamedType newInstance(ClassInfo info, JavaWeaver weaver) { + return new JNamedType(info, weaver); } @Override @@ -59,11 +61,6 @@ public String[] getInterfacesArrayImpl() { return Arrays.stream(interfaces).map(i -> i.getName()).toArray(String[]::new); } - // @Override - // public String[] getModifiersArrayImpl() { - // return null; - // } - @Override public String getJavadocImpl() { // TODO Auto-generated method stub diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JNew.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JNew.java index f463070a..c4570a39 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JNew.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JNew.java @@ -18,6 +18,7 @@ import spoon.reflect.code.CtConstructorCall; import spoon.reflect.code.CtExpression; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.ANew; import weaver.utils.weaving.SelectUtils; @@ -26,14 +27,14 @@ public class JNew extends ANew { private final CtConstructorCall constructorCall; - public JNew(CtConstructorCall constructorCall) { - super(new JExpression<>(constructorCall)); + public JNew(CtConstructorCall constructorCall, JavaWeaver weaver) { + super(new JExpression<>(constructorCall, weaver), weaver); this.constructorCall = constructorCall; } - public static JNew newInstance(CtConstructorCall node) { - return new JNew<>(node); + public static JNew newInstance(CtConstructorCall node, JavaWeaver weaver) { + return new JNew<>(node, weaver); } @Override @@ -49,7 +50,8 @@ public String getNameImpl() { @Override public AExpression[] getArgumentsArrayImpl() { return SelectUtils.nodeList2JoinPointList(constructorCall.getArguments(), - arg -> JExpression.newInstance(arg)) + arg -> JExpression.newInstance(arg, + getWeaverEngine())) .toArray(new AExpression[0]); } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignment.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignment.java index 08f81e00..098f8d94 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignment.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignment.java @@ -16,6 +16,7 @@ import pt.up.fe.specs.util.SpecsLogs; import spoon.reflect.code.CtOperatorAssignment; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AOpAssignment; import weaver.utils.element.OperatorUtils; @@ -23,8 +24,8 @@ public class JOpAssignment extends AOpAssignment { private final CtOperatorAssignment node; - public JOpAssignment(CtOperatorAssignment node) { - super(new JAssignment<>(node)); + public JOpAssignment(CtOperatorAssignment node, JavaWeaver weaver) { + super(new JAssignment<>(node, weaver), weaver); this.node = node; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignmentAux.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignmentAux.java index 46cf42c5..eb72aa24 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignmentAux.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JOpAssignmentAux.java @@ -14,19 +14,21 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtOperatorAssignment; +import weaver.kadabra.JavaWeaver; import weaver.utils.element.OperatorUtils; public class JOpAssignmentAux extends JAssignment { private final CtOperatorAssignment node; - private JOpAssignmentAux(CtOperatorAssignment node) { - super(node); + private JOpAssignmentAux(CtOperatorAssignment node, JavaWeaver weaver) { + super(node, weaver); this.node = node; } - public static JOpAssignmentAux newInstance(CtOperatorAssignment node) { - return new JOpAssignmentAux<>(node); + public static JOpAssignmentAux newInstance(CtOperatorAssignment node, + JavaWeaver weaver) { + return new JOpAssignmentAux<>(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JPragma.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JPragma.java index 79177a43..c6fdbc6e 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JPragma.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JPragma.java @@ -17,6 +17,7 @@ import java.util.regex.Pattern; import spoon.reflect.code.CtComment; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.APragma; import weaver.kadabra.enums.CommentType; @@ -24,22 +25,22 @@ public class JPragma extends APragma { private final CtComment comment; - public JPragma(CtComment comment) { - super(JComment.newInstance(comment)); + public JPragma(CtComment comment, JavaWeaver weaver) { + super(JComment.newInstance(comment, weaver), weaver); this.comment = comment; } - public JPragma(JComment comment) { - super(comment); + public JPragma(JComment comment, JavaWeaver weaver) { + super(comment, weaver); this.comment = comment.getNode(); } - public static JPragma newInstance(CtComment comment) { - return new JPragma(comment); + public static JPragma newInstance(CtComment comment, JavaWeaver weaver) { + return new JPragma(comment, weaver); } - public static JPragma newInstance(JComment comment) { - return new JPragma(comment); + public static JPragma newInstance(JComment comment, JavaWeaver weaver) { + return new JPragma(comment, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JReference.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JReference.java index 096fac92..361c6423 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JReference.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JReference.java @@ -15,19 +15,21 @@ import spoon.reflect.declaration.CtElement; import spoon.reflect.reference.CtReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; import weaver.kadabra.abstracts.joinpoints.AReference; import weaver.utils.weaving.converters.CtElement2JoinPoint; public class JReference extends AReference { - public static JReference newInstance(CtReference node) { - return new JReference(node); + public static JReference newInstance(CtReference node, JavaWeaver weaver) { + return new JReference(node, weaver); } private final CtReference node; - public JReference(CtReference node) { + public JReference(CtReference node, JavaWeaver weaver) { + super(weaver); this.node = node; } @@ -52,7 +54,7 @@ public AJoinPoint getDeclarationImpl() { return null; } - return CtElement2JoinPoint.convert(decl); + return CtElement2JoinPoint.convert(decl, getWeaverEngine()); } @Override @@ -68,20 +70,6 @@ public String getTypeImpl() { return type; } - // @Override - // public ATypeReference getTypeImpl() { - // return new JTypeReference<>(node); - // String type = node.getClass().getSimpleName(); - // if (type.startsWith("Ct")) { - // type = type.substring(2); - // } - // if (type.endsWith("ReferenceImpl")) { - // type = type.substring(0, type.length() - "ReferenceImpl".length()); - // } - // - // return type; - // } - @Override public String toString() { return getNameImpl() + " - " + getTypeImpl(); diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JReturn.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JReturn.java index 5c4147f4..6fd69abc 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JReturn.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JReturn.java @@ -14,24 +14,25 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtReturn; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AReturn; public class JReturn extends AReturn { private final CtReturn node; - public static JReturn newInstance(CtReturn node) { - return new JReturn<>(node); + public static JReturn newInstance(CtReturn node, JavaWeaver weaver) { + return new JReturn<>(node, weaver); } - private JReturn(CtReturn node) { - super(new JStatement(node)); - this.node = node; + private JReturn(CtReturn node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); + this.node = node; } @Override public CtReturn getNode() { - return node; + return node; } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetExpr.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetExpr.java index d1d69ec1..46bebd8e 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetExpr.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetExpr.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtCodeSnippetExpression; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ASnippetExpr; import weaver.kadabra.spoon.extensions.nodes.CtKadabraSnippetExpression; @@ -21,13 +22,13 @@ public class JSnippetExpr extends ASnippetExpr { private CtKadabraSnippetExpression node; - private JSnippetExpr(CtKadabraSnippetExpression expr) { - super(new JExpression(expr.getOriginal())); + private JSnippetExpr(CtKadabraSnippetExpression expr, JavaWeaver weaver) { + super(new JExpression(expr.getOriginal(), weaver), weaver); this.node = expr; } - public static JSnippetExpr newInstance(CtKadabraSnippetExpression expr) { - return new JSnippetExpr(expr); + public static JSnippetExpr newInstance(CtKadabraSnippetExpression expr, JavaWeaver weaver) { + return new JSnippetExpr(expr, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetStmt.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetStmt.java index 51d4f9b5..f409df1d 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetStmt.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JSnippetStmt.java @@ -13,6 +13,7 @@ package weaver.kadabra.joinpoints; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ASnippetStmt; import weaver.kadabra.spoon.extensions.nodes.CtKadabraSnippetStatement; @@ -20,35 +21,15 @@ public class JSnippetStmt extends ASnippetStmt { private CtKadabraSnippetStatement node; - private JSnippetStmt(CtKadabraSnippetStatement stmt) { - super(new JStatement(stmt)); + private JSnippetStmt(CtKadabraSnippetStatement stmt, JavaWeaver weaver) { + super(new JStatement(stmt, weaver), weaver); this.node = stmt; } - public static JSnippetStmt newInstance(CtKadabraSnippetStatement stmt) { - return new JSnippetStmt(stmt); + public static JSnippetStmt newInstance(CtKadabraSnippetStatement stmt, JavaWeaver weaver) { + return new JSnippetStmt(stmt, weaver); } - // @Override - // public String getKindImpl() { - // return "Snippet"; - // } - - // @Override - // public Integer getEndLineImpl() { - // return null; - // } - // - // @Override - // public List selectVar() { - // return Collections.emptyList(); - // } - // - // @Override - // public List selectCall() { - // return Collections.emptyList(); - // } - @Override public CtKadabraSnippetStatement getNode() { return node; diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JStatement.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JStatement.java index 054d2c0b..036cd341 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JStatement.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JStatement.java @@ -17,6 +17,7 @@ import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtElement; import tdrc.utils.StringUtils; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; import weaver.kadabra.abstracts.joinpoints.AStatement; @@ -27,31 +28,31 @@ public class JStatement extends AStatement { private final CtStatement node; - public JStatement(CtStatement node) { - + public JStatement(CtStatement node, JavaWeaver weaver) { + super(weaver); this.node = node; } - public static AJavaWeaverJoinPoint newInstance(CtStatement node) { - return CtStatement2AStatement.convert(node); + public static AJavaWeaverJoinPoint newInstance(CtStatement node, JavaWeaver weaver) { + return CtStatement2AStatement.convert(node, weaver); } @Override public AJoinPoint[] insertImpl(String position, JoinPoint code) { - return new AJoinPoint[]{insertImplJStatement(position, (CtElement) code.getNode())}; + return new AJoinPoint[] { insertImplJStatement(position, (CtElement) code.getNode()) }; } @Override public AJoinPoint[] insertImpl(String position, String code) { - return new AJoinPoint[]{insertImplJStatement(position, code)}; + return new AJoinPoint[] { insertImplJStatement(position, code) }; } public AJavaWeaverJoinPoint insertImplJStatement(String position, CtElement code) { - return ActionUtils.insert(position, code, node); + return ActionUtils.insert(position, code, node, getWeaverEngine()); } public AJavaWeaverJoinPoint insertImplJStatement(String position, String code) { - return ActionUtils.insert(position, code, node); + return ActionUtils.insert(position, code, node, getWeaverEngine()); } @Override @@ -84,26 +85,4 @@ public String getKindImpl() { String tempType = node.getClass().getSimpleName().replace("Ct", "").replace("Impl", ""); return StringUtils.firstCharToLower(tempType); } - - /* - @Override - public List selectBinaryExpr() { - return selectBinaryExpression(); - } - - @Override - public List selectBinaryExpression() { - @SuppressWarnings("unchecked") - List select = SelectUtils.select(node, CtBinaryOperator.class, - JBinaryExpression::newInstance); - return select; - } - - @Override - public List selectArrayAccess() { - @SuppressWarnings("unchecked") - List select = SelectUtils.select(node, CtArrayAccess.class, JArrayAccess::newInstance); - return select; // TODO Auto-generated method stub - } - */ } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JSwitch.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JSwitch.java index 9a882b43..7a4e9c22 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JSwitch.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JSwitch.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtSwitch; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ACase; import weaver.kadabra.abstracts.joinpoints.ASwitch; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -22,13 +23,13 @@ public class JSwitch extends ASwitch { private final CtSwitch node; - private JSwitch(CtSwitch node) { - super(new JStatement(node)); + private JSwitch(CtSwitch node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JSwitch newInstance(CtSwitch node) { - return new JSwitch<>(node); + public static JSwitch newInstance(CtSwitch node, JavaWeaver weaver) { + return new JSwitch<>(node, weaver); } @Override @@ -38,7 +39,7 @@ public CtSwitch getNode() { @Override public ACase[] getCasesArrayImpl() { - return CtElement2JoinPoint.convertList(node.getCases(), ACase.class); + return CtElement2JoinPoint.convertList(node.getCases(), getWeaverEngine(), ACase.class); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JTernary.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JTernary.java index 61fb3f84..4c9b66fb 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JTernary.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JTernary.java @@ -15,6 +15,7 @@ import spoon.reflect.code.CtConditional; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.ATernary; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -23,14 +24,14 @@ public class JTernary extends ATernary { private final CtConditional conditional; - public JTernary(CtConditional conditional) { - super(new JExpression<>(conditional)); + public JTernary(CtConditional conditional, JavaWeaver weaver) { + super(new JExpression<>(conditional, weaver), weaver); this.conditional = conditional; } - public static JTernary newInstance(CtConditional node) { - return new JTernary<>(node); + public static JTernary newInstance(CtConditional node, JavaWeaver weaver) { + return new JTernary<>(node, weaver); } @Override @@ -40,7 +41,7 @@ public CtElement getNode() { @Override public AExpression getConditionImpl() { - return (AExpression) CtElement2JoinPoint.convert(conditional.getCondition()); + return (AExpression) CtElement2JoinPoint.convert(conditional.getCondition(), getWeaverEngine()); } @Override @@ -50,11 +51,11 @@ public AExpression getCondImpl() { @Override public AExpression getThenImpl() { - return (AExpression) CtElement2JoinPoint.convert(conditional.getThenExpression()); + return (AExpression) CtElement2JoinPoint.convert(conditional.getThenExpression(), getWeaverEngine()); } @Override public AExpression getElseImpl() { - return (AExpression) CtElement2JoinPoint.convert(conditional.getElseExpression()); + return (AExpression) CtElement2JoinPoint.convert(conditional.getElseExpression(), getWeaverEngine()); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JThis.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JThis.java index d187d180..6db5d18b 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JThis.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JThis.java @@ -15,14 +15,15 @@ import spoon.reflect.code.CtThisAccess; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AThis; public class JThis extends AThis { private final CtThisAccess thisNode; - public JThis(CtThisAccess thisNode) { - super(new JExpression<>(thisNode)); + public JThis(CtThisAccess thisNode, JavaWeaver weaver) { + super(new JExpression<>(thisNode, weaver), weaver); this.thisNode = thisNode; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JThrow.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JThrow.java index 35ebb235..6c19c745 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JThrow.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JThrow.java @@ -14,19 +14,20 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtThrow; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AThrow; public class JThrow extends AThrow { private final CtThrow node; - private JThrow(CtThrow node) { - super(new JStatement(node)); + private JThrow(CtThrow node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JThrow newInstance(CtThrow node) { - return new JThrow(node); + public static JThrow newInstance(CtThrow node, JavaWeaver weaver) { + return new JThrow(node, weaver); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JTry.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JTry.java index e7fc43d6..51cd8a00 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JTry.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JTry.java @@ -16,6 +16,7 @@ import java.util.stream.Collectors; import spoon.reflect.code.CtTry; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ABody; import weaver.kadabra.abstracts.joinpoints.ACatch; import weaver.kadabra.abstracts.joinpoints.ATry; @@ -25,13 +26,13 @@ public class JTry extends ATry { private CtTry node; - private JTry(CtTry node) { - super(new JStatement(node)); + private JTry(CtTry node, JavaWeaver weaver) { + super(new JStatement(node, weaver), weaver); this.node = node; } - public static JTry newInstance(CtTry node) { - return new JTry(node); + public static JTry newInstance(CtTry node, JavaWeaver weaver) { + return new JTry(node, weaver); } @Override @@ -41,14 +42,15 @@ public CtTry getNode() { @Override public ABody getBodyImpl() { - return CtElement2JoinPoint.convert(node.getBody(), ABody.class); + return CtElement2JoinPoint.convert(node.getBody(), getWeaverEngine(), ABody.class); } @Override public ACatch[] getCatchesArrayImpl() { return node.getCatchers().stream() - .map(catchNode -> CtElement2JoinPoint.convert(catchNode, ACatch.class)) + .map(catchNode -> CtElement2JoinPoint.convert(catchNode, + getWeaverEngine(), ACatch.class)) .collect(Collectors.toList()) .toArray(new ACatch[0]); diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JType.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JType.java index 94a581bf..7bc57a32 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JType.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JType.java @@ -18,6 +18,7 @@ import spoon.refactoring.Refactoring; import spoon.reflect.declaration.*; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.*; import weaver.kadabra.exceptions.JavaWeaverException; @@ -34,33 +35,25 @@ public class JType extends AType { private CtType node; private CtCompilationUnit parent; - private JType(CtType node, CtCompilationUnit parent) { - // private JType(CtType node) {// , CompilationUnit parent) { + private JType(CtType node, CtCompilationUnit parent, JavaWeaver weaver) { + super(weaver); this.node = node; this.parent = parent; } - // * @deprecated use version that does not need the parent paramenter - /** * @param * @param node * @param parent * @return */ - // @Deprecated - public static JType newInstance(CtType node, CtCompilationUnit parent) { - // return newInstance(node); - return new JType<>(node, parent); + public static JType newInstance(CtType node, CtCompilationUnit parent, JavaWeaver weaver) { + return new JType<>(node, parent, weaver); } - // public static JType newInstance(CtType node) { - // return new JType<>(node);// , parent); - // } - @Override public AJoinPoint copyImpl() { - return CtElement2JoinPoint.convert(Refactoring.copyType(node)); + return CtElement2JoinPoint.convert(Refactoring.copyType(node), getWeaverEngine()); } @Override @@ -82,7 +75,7 @@ public ATypeReference getSuperClassJpImpl() { return null; } - return (ATypeReference) CtElement2JoinPoint.convert(superclass); + return (ATypeReference) CtElement2JoinPoint.convert(superclass, getWeaverEngine()); } @@ -98,7 +91,8 @@ public String[] getInterfacesArrayImpl() { @Override public AInterfaceType[] getInterfacesTypesArrayImpl() { var els = node.getSuperInterfaces().stream() - .map(el -> CtElement2JoinPoint.convert(el, AInterfaceType.class)) + .map(el -> CtElement2JoinPoint.convert(el, + getWeaverEngine(), AInterfaceType.class)) .collect(Collectors.toList()); return els.toArray(new AInterfaceType[0]); @@ -129,12 +123,6 @@ public void addInterfaceImpl(AInterfaceType newInterface) { node.addNestedType((CtType) newInterface.getNode()); } - // @Override - // public AInterface removeInterfaceImpl(AInterface _interface) { - // // TODO Auto-generated method stub - // return super.removeInterfaceImpl(_interface); - // } - @Override public AInterfaceType removeInterfaceImpl(String interfaceName) { @@ -143,9 +131,6 @@ public AInterfaceType removeInterfaceImpl(String interfaceName) { .findFirst() .orElse(null); - // System.out.println("NESTED TYPES: " + node.getNestedTypes()); - // var interfaceNode = node.getNestedType(interfaceName); - if (interfaceNode == null) { SpecsLogs.info("removeInterface: could not find interface with name '" + interfaceName + "'"); return null; @@ -153,7 +138,6 @@ public AInterfaceType removeInterfaceImpl(String interfaceName) { var success = node.removeSuperInterface(interfaceNode); - // var success = node.removeNestedType(interfaceNode); if (!success) { SpecsLogs.info("removeInterface: could not remove interface " + interfaceName); return null; @@ -167,7 +151,7 @@ public AInterfaceType removeInterfaceImpl(String interfaceName) { return null; } - return CtElement2JoinPoint.convert(interfaceNode.getTypeDeclaration(), AInterfaceType.class); + return CtElement2JoinPoint.convert(interfaceNode.getTypeDeclaration(), getWeaverEngine(), AInterfaceType.class); } @Override @@ -183,14 +167,16 @@ public void addImplementImpl(AInterfaceType _interface) { } @Override - public AMethod newMethodImpl(String[] modifiers, String returnType, String name, String[] paramLeft, String[] paramRight, String code) { + public AMethod newMethodImpl(String[] modifiers, String returnType, String name, String[] paramLeft, + String[] paramRight, String code) { CtMethod newMethod = ActionUtils.newMethod(node, name, returnType, paramLeft, paramRight, modifiers, code); - JMethod newInstance = JMethod.newInstance(newMethod); + JMethod newInstance = JMethod.newInstance(newMethod, getWeaverEngine()); return newInstance; } @Override - public AMethod newMethodImpl(String[] modifiers, String returnType, String name, String[] paramLeft, String[] paramRight) { + public AMethod newMethodImpl(String[] modifiers, String returnType, String name, String[] paramLeft, + String[] paramRight) { return newMethodImpl(modifiers, returnType, name, paramLeft, paramRight, ""); } @@ -208,7 +194,7 @@ public void insertCodeImpl(String code) { @Override public AField newFieldImpl(String[] modifiers, String fieldType, String baseName, String initialValue) { CtField newField = ActionUtils.newField(node, baseName, fieldType, initialValue, modifiers); - JField newInstance = JField.newInstance(newField); + JField newInstance = JField.newInstance(newField, getWeaverEngine()); return newInstance; } @@ -235,20 +221,20 @@ public static ModifierKind getModifier(String value) { @Override public AJoinPoint[] insertImpl(String position, JoinPoint code) { - return new AJoinPoint[]{insertImplJType(position, (CtElement) code.getNode())}; + return new AJoinPoint[] { insertImplJType(position, (CtElement) code.getNode()) }; } @Override public AJoinPoint[] insertImpl(String position, String code) { - return new AJoinPoint[]{insertImplJType(position, code)}; + return new AJoinPoint[] { insertImplJType(position, code) }; } public AJavaWeaverJoinPoint insertImplJType(String position, CtElement code) { - return ActionUtils.insertMember(node, code, position); + return ActionUtils.insertMember(node, code, position, getWeaverEngine()); } public AJavaWeaverJoinPoint insertImplJType(String position, String code) { - return ActionUtils.insertMember(node, code, position); + return ActionUtils.insertMember(node, code, position, getWeaverEngine()); } @Override @@ -278,25 +264,15 @@ public Boolean isSubtypeOfImpl(String type) { } - // @Override - // public Boolean getIsFinalImpl() { - // return node.hasModifier(ModifierKind.FINAL); - // } - // - // @Override - // public Boolean getIsStaticImpl() { - // return node.hasModifier(ModifierKind.STATIC); - // } - @Override public AJoinPoint getParentImpl() { var spoonParent = getNode().getParent(); if (spoonParent != null && !(spoonParent instanceof CtPackage)) { - return CtElement2JoinPoint.convert(spoonParent); + return CtElement2JoinPoint.convert(spoonParent, getWeaverEngine()); } - return CtElement2JoinPoint.convert(parent); + return CtElement2JoinPoint.convert(parent, getWeaverEngine()); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JTypeReference.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JTypeReference.java index 3b424b3a..b3903022 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JTypeReference.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JTypeReference.java @@ -15,6 +15,7 @@ import spoon.reflect.declaration.CtElement; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.ATypeReference; import java.util.Set; @@ -26,14 +27,14 @@ public class JTypeReference extends ATypeReference { private final CtTypeReference typeReference; - public JTypeReference(CtTypeReference typeReference) { - super(new JReference(typeReference)); + public JTypeReference(CtTypeReference typeReference, JavaWeaver weaver) { + super(new JReference(typeReference, weaver), weaver); this.typeReference = typeReference; } - public static JTypeReference newInstance(CtTypeReference node) { - return new JTypeReference<>(node); + public static JTypeReference newInstance(CtTypeReference node, JavaWeaver weaver) { + return new JTypeReference<>(node, weaver); } @Override @@ -52,17 +53,12 @@ public Boolean getIsArrayImpl() { try { return typeReference.getActualClass().isArray(); } catch (Exception e) { - // Do nothing, sometimes it can launch exception, such as when the type of the class is not on the classpath + // Do nothing, sometimes it can launch exception, such as when the type of the + // class is not on the classpath return false; } } - // @Override - // public String getReferenceTypeImpl() { - // return getIsArrayImpl() ? typeReference.getActualClass().getComponentType().toString() - // : super.getReferenceTypeImpl(); - // } - @Override public String toString() { return getNameImpl(); @@ -114,19 +110,4 @@ public String getQualifiedNameImpl() { return packageName != null ? packageName + "." + typeReference.getSimpleName() : typeReference.getSimpleName(); } - - // @Override - // public String toString() { - // var type = getIsArrayImpl() ? typeReference.getActualClass().getComponentType().toString() - // : getReferenceTypeImpl(); - // - // return getNameImpl() + " - " + type; - // - // // if (getIsArrayImpl()) { - // // return typeReference.getActualClass().getComponentType().toString(); - // // } - // // - // // return getReferenceTypeImpl(); - // } - } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JUnaryExpression.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JUnaryExpression.java index ba0f7846..6047aa7b 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JUnaryExpression.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JUnaryExpression.java @@ -16,6 +16,7 @@ import pt.up.fe.specs.util.SpecsLogs; import spoon.reflect.code.CtUnaryOperator; import spoon.reflect.code.UnaryOperatorKind; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.abstracts.joinpoints.AUnaryExpression; import weaver.utils.element.OperatorUtils; @@ -25,13 +26,13 @@ public class JUnaryExpression extends AUnaryExpression { public CtUnaryOperator node; - public JUnaryExpression(CtUnaryOperator expr) { - super(new JExpression<>(expr)); + public JUnaryExpression(CtUnaryOperator expr, JavaWeaver weaver) { + super(new JExpression<>(expr, weaver), weaver); node = expr; } - public static JUnaryExpression newInstance(CtUnaryOperator expr) { - return new JUnaryExpression<>(expr); + public static JUnaryExpression newInstance(CtUnaryOperator expr, JavaWeaver weaver) { + return new JUnaryExpression<>(expr, weaver); } @Override @@ -64,7 +65,7 @@ public void setOperatorImpl(String operator) { @Override public AExpression getOperandImpl() { - return SelectUtils.expression2JoinPoint(node.getOperand()); + return SelectUtils.expression2JoinPoint(node.getOperand(), getWeaverEngine()); } } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JVar.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JVar.java index 7051e4cb..99677e39 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JVar.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JVar.java @@ -24,6 +24,7 @@ import spoon.reflect.code.CtUnaryOperator; import spoon.reflect.code.CtVariableAccess; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; import weaver.kadabra.abstracts.joinpoints.ATypeReference; @@ -37,18 +38,13 @@ public class JVar extends AVar { private final CtVariableAccess node; - protected JVar(CtVariableAccess var) { - super(new JExpression<>(var)); + protected JVar(CtVariableAccess var, JavaWeaver weaver) { + super(new JExpression<>(var, weaver), weaver); node = var; } - public static JVar newInstance(CtVariableAccess var) { - - // if (var instanceof CtFieldAccess) { - // return JFieldAccess.newInstance((CtFieldAccess) var); - // } - - return new JVar<>(var); + public static JVar newInstance(CtVariableAccess var, JavaWeaver weaver) { + return new JVar<>(var, weaver); } @Override @@ -77,13 +73,13 @@ public String getReferenceImpl() { if (parent instanceof CtUnaryOperator) { final CtUnaryOperator unOp = (CtUnaryOperator) parent; switch (unOp.getKind()) { - case POSTINC: - case POSTDEC: - case PREINC: - case PREDEC: - return RefType.READWRITE.getName(); - default: - break; + case POSTINC: + case POSTDEC: + case PREINC: + case PREDEC: + return RefType.READWRITE.getName(); + default: + break; } } @@ -92,8 +88,7 @@ public String getReferenceImpl() { @Override public ATypeReference getTypeReferenceImpl() { - return new JTypeReference<>(node.getType()); - // return CtTypeReferenceUtils.getType(node.getType()); + return new JTypeReference<>(node.getType(), getWeaverEngine()); } @Override @@ -113,8 +108,6 @@ public Boolean getIsPrimitiveImpl() { @Override public String toString() { - // final String isArray = getIsArray() ? "[]" : ""; - // return node.getVariable().toString() + " (" + getType() + isArray + ", " + getReference() + ")"; return node.toString(); } @@ -135,16 +128,6 @@ public Boolean getInLoopHeaderImpl() { return SpoonUtils.insideHeader(loop, node); } - // @Override - // public void insertImpl(String position, String code) { - // // final CtStatement parentStatement = node.getParent(CtStatement.class); - // // final CtElement parent = node.getParent(); - // - // // System.out.println("PARENT: " + parent.getClass() + ""); - // // System.out.println(parent); - // ActionUtils.insert(position, code, node, getWeaverProfiler()); - // } - @Override public CtVariableAccess getNode() { return node; @@ -167,54 +150,6 @@ public AJavaWeaverJoinPoint getDeclarationImpl() { return null; } - return CtElement2JoinPoint.convert(decl); + return CtElement2JoinPoint.convert(decl, getWeaverEngine()); } - - // @Override - // public String[] getModifiersArrayImpl() { - // var decl = getDeclarationImpl(); - // if (decl == null) { - // return new String[0]; - // } - // - // return JoinPoints.getModifiersInternal(decl).stream() - // .map(ModifierKind::name) - // .toArray(length -> new String[length]); - // } - - // @Override - // public Set getModifiersInternal() { - // var decl = getDeclarationImpl(); - // if (decl == null) { - // return Collections.emptySet(); - // } - // - // return decl.getModifiersInternal(); - // } - - // @Override - // public String[] getModifiersArrayImpl() { - // return node.getVariable().getModifiers().stream() - // .map(ModifierKind::name) - // .toArray(length -> new String[length]); - // } - - // @Override - // public Boolean getIsFinalImpl() { - // return node.getVariable().getModifiers().contains(ModifierKind.FINAL); - // } - // - // @Override - // public Boolean getIsStaticImpl() { - // return node.getVariable().getModifiers().contains(ModifierKind.STATIC); - // } - - // @Override - // public Boolean getIsFinalImpl() { - // System.out.println("Get modifiers attribute: " + Arrays.asList(getModifiersArrayImpl())); - // System.out.println("Get modifiers internal: " + getModifiersInternal()); - // return super.getIsFinalImpl(); - // // return getModifiersInternal().contains(ModifierKind.FINAL); - // } - } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JWhile.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JWhile.java index efb7dc0c..0e2832d8 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JWhile.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JWhile.java @@ -14,6 +14,7 @@ package weaver.kadabra.joinpoints; import spoon.reflect.code.CtWhile; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExpression; import weaver.kadabra.enums.LoopType; import weaver.utils.weaving.converters.CtElement2JoinPoint; @@ -22,18 +23,18 @@ public class JWhile extends JLoop { CtWhile node; - private JWhile(CtWhile node) { - super(node, LoopType.WHILE); + private JWhile(CtWhile node, JavaWeaver weaver) { + super(node, LoopType.WHILE, weaver); this.node = node; } - public static JWhile newInstance(CtWhile node) { - return new JWhile(node); + public static JWhile newInstance(CtWhile node, JavaWeaver weaver) { + return new JWhile(node, weaver); } @Override public AExpression getCondImpl() { - return (AExpression) CtElement2JoinPoint.convert(node.getLoopingExpression()); + return (AExpression) CtElement2JoinPoint.convert(node.getLoopingExpression(), getWeaverEngine()); } @Override diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlElement.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlElement.java index 040b1ad8..213bde41 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlElement.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlElement.java @@ -15,14 +15,15 @@ import pt.up.fe.specs.util.xml.XmlElement; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AXmlElement; public class JXmlElement extends AXmlElement { private final XmlElement element; - public JXmlElement(XmlElement element) { - super(new JXmlNode(element)); + public JXmlElement(XmlElement element, JavaWeaver weaver) { + super(new JXmlNode(element, weaver), weaver); this.element = element; } diff --git a/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlNode.java b/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlNode.java index 7c468df6..4b53110f 100644 --- a/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlNode.java +++ b/JavaWeaver/src/weaver/kadabra/joinpoints/JXmlNode.java @@ -16,6 +16,7 @@ import pt.up.fe.specs.util.xml.XmlElement; import pt.up.fe.specs.util.xml.XmlNode; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; import weaver.kadabra.abstracts.joinpoints.AXmlElement; import weaver.kadabra.abstracts.joinpoints.AXmlNode; @@ -25,7 +26,8 @@ public class JXmlNode extends AXmlNode { private final XmlNode node; - public JXmlNode(XmlNode node) { + public JXmlNode(XmlNode node, JavaWeaver weaver) { + super(weaver); this.node = node; } @@ -36,20 +38,20 @@ public CtElement getNode() { @Override public AJoinPoint getParentImpl() { - return XmlNode2JoinPoint.convert(node.getParent()); + return XmlNode2JoinPoint.convert(node.getParent(), getWeaverEngine()); } @Override public AJoinPoint[] getChildrenArrayImpl() { return node.getChildren().stream() - .map(XmlNode2JoinPoint::convert) + .map(child -> XmlNode2JoinPoint.convert(child, getWeaverEngine())) .toArray(length -> new AJoinPoint[length]); } @Override public AJoinPoint[] getDescendantsArrayImpl() { return node.getDescendants().stream() - .map(XmlNode2JoinPoint::convert) + .map(child -> XmlNode2JoinPoint.convert(child, getWeaverEngine())) .toArray(length -> new AJoinPoint[length]); } @@ -57,7 +59,8 @@ public AJoinPoint[] getDescendantsArrayImpl() { public AXmlElement[] getElementsArrayImpl() { return node.getDescendants().stream() .filter(node -> node instanceof XmlElement) - .map(element -> (AXmlElement) XmlNode2JoinPoint.convert(element)) + .map(element -> (AXmlElement) XmlNode2JoinPoint.convert(element, + getWeaverEngine())) .toArray(length -> new AXmlElement[length]); } diff --git a/JavaWeaver/src/weaver/utils/KadabraAstMethods.java b/JavaWeaver/src/weaver/utils/KadabraAstMethods.java index 422e68a4..d0198a40 100644 --- a/JavaWeaver/src/weaver/utils/KadabraAstMethods.java +++ b/JavaWeaver/src/weaver/utils/KadabraAstMethods.java @@ -20,6 +20,7 @@ import spoon.reflect.code.CtBodyHolder; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.utils.weaving.converters.CtElement2JoinPoint; public class KadabraAstMethods extends AAstMethods { @@ -28,6 +29,11 @@ public KadabraAstMethods(WeaverEngine weaverEngine) { super(weaverEngine); } + @Override + protected JavaWeaver getWeaverEngine() { + return (JavaWeaver) super.getWeaverEngine(); + } + @Override public Class getNodeClass() { return CtElement.class; @@ -35,7 +41,7 @@ public Class getNodeClass() { @Override protected JoinPoint toJavaJoinPointImpl(CtElement node) { - return CtElement2JoinPoint.convert(node); + return CtElement2JoinPoint.convert(node, this.getWeaverEngine()); } @Override diff --git a/JavaWeaver/src/weaver/utils/SpoonUtils.java b/JavaWeaver/src/weaver/utils/SpoonUtils.java index 2e3bc651..6801b064 100644 --- a/JavaWeaver/src/weaver/utils/SpoonUtils.java +++ b/JavaWeaver/src/weaver/utils/SpoonUtils.java @@ -41,6 +41,7 @@ import spoon.reflect.reference.CtLocalVariableReference; import spoon.reflect.reference.CtTypeReference; import spoon.reflect.visitor.DefaultJavaPrettyPrinter; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AJoinPoint; import weaver.kadabra.exceptions.JavaWeaverException; import weaver.kadabra.spoon.extensions.nodes.CtCommentWrapper; @@ -246,7 +247,7 @@ public static boolean isExecutable(CtElement node) { } public static CtLocalVariable extract(CtExpression expression, String varName, CtStatement target, - String position) { + String position, JavaWeaver weaver) { Factory factory = expression.getFactory(); CtTypeReference type = expression.getType(); @@ -262,7 +263,7 @@ public static CtLocalVariable extract(CtExpression expression, String newVar.setDefaultExpression(expression); // and insert the variable declaration before/after the given target statement - ActionUtils.insert(position, newVar, target); + ActionUtils.insert(position, newVar, target, weaver); return newVar; } @@ -549,9 +550,9 @@ public static void setModifiers(CtElement node, Set modifiers) { * @param prefix * @return */ - public static String toAst(CtElement astNode, String prefix) { + public static String toAst(CtElement astNode, String prefix, JavaWeaver weaver) { var builder = new StringBuilder(); - toAst(CtElement2JoinPoint.convert(astNode), prefix, builder); + toAst(CtElement2JoinPoint.convert(astNode, weaver), prefix, builder); return builder.toString(); } diff --git a/JavaWeaver/src/weaver/utils/android/AndroidResources.java b/JavaWeaver/src/weaver/utils/android/AndroidResources.java index ceea1c71..f4d08408 100644 --- a/JavaWeaver/src/weaver/utils/android/AndroidResources.java +++ b/JavaWeaver/src/weaver/utils/android/AndroidResources.java @@ -19,6 +19,7 @@ import pt.up.fe.specs.util.SpecsIo; import pt.up.fe.specs.util.SpecsLogs; import pt.up.fe.specs.util.xml.XmlDocument; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.joinpoints.JXmlNode; /** @@ -48,7 +49,6 @@ public void write(File outputFolder) { if (androidManifest != null) { File manifestFile = new File(realOutputFolder, srcFolder.getName() + "/main/AndroidManifest.xml"); androidManifest.write(manifestFile); - // System.out.println("WROTE " + manifestFile.getAbsolutePath()); } } @@ -83,9 +83,9 @@ public XmlDocument getAndroidManifest() { return this.androidManifest; } - public static JXmlNode parseXml(String xmlCode) { + public static JXmlNode parseXml(String xmlCode, JavaWeaver weaver) { var xmlNode = XmlDocument.newInstance(xmlCode); - return new JXmlNode(xmlNode); + return new JXmlNode(xmlNode, weaver); } /** @@ -105,27 +105,14 @@ public static AndroidResources newInstance(List sources) { } var relativePath = SpecsIo.getRelativePath(srcFolder.getParentFile(), source); - // System.out.println("SRC FOLDER: " + srcFolder); - // System.out.println("SOURCE: " + source); - // System.out.println("RELATIVE PATH: " + relativePath); return new AndroidResources(srcFolder, relativePath); } return new AndroidResources(null, ""); - - // var srcFolder = sources.stream() - // .map(AndroidResources::getSrcFolder) - // .filter(src -> src != null) - // .findFirst() - // .orElse(null); - // - // return new AndroidResources(srcFolder); } private static File getSrcFolder(File path) { var candidateFolder = path; - // System.out.println("PATH: " + path); - // System.out.println("FILES: " + SpecsIo.getFilesRecursive(path)); // Get parent in source is a file if (candidateFolder.isFile()) { candidateFolder = candidateFolder.getParentFile(); @@ -148,16 +135,5 @@ private static File getSrcFolder(File path) { private static boolean hasAndroidManifest(File srcFolder) { return new File(srcFolder, "main/AndroidManifest.xml").isFile(); - /* - var mainFolder = new File(srcFolder, "main"); - - if (!mainFolder.isDirectory()) { - return false; - } - - var androidManifest = new File(mainFolder, "AndroidManifest.xml"); - - return androidManifest.isFile(); - */ } } diff --git a/JavaWeaver/src/weaver/utils/generators/AdapterGenerator.java b/JavaWeaver/src/weaver/utils/generators/AdapterGenerator.java index 3d5a31c0..2c52d2cb 100644 --- a/JavaWeaver/src/weaver/utils/generators/AdapterGenerator.java +++ b/JavaWeaver/src/weaver/utils/generators/AdapterGenerator.java @@ -38,6 +38,7 @@ import spoon.reflect.reference.CtExecutableReference; import spoon.reflect.reference.CtFieldReference; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.agent.MethodAdapter; import weaver.kadabra.exceptions.JavaWeaverException; import weaver.kadabra.joinpoints.JClass; @@ -55,7 +56,8 @@ public class AdapterGenerator { /** * Generate an adapter for a target class based on a given method signature.
- * NOTE: the method signature has to be: byte[] (String,byte[] [,]); + * NOTE: the method signature has to be: byte[] (String,byte[] + * [,]); * * @param name * @param adapterMethod @@ -63,7 +65,8 @@ public class AdapterGenerator { * @param targetClass * @return */ - public static JClass generate(String name, CtMethod adapterMethod, CtMethod targetMethod, + public static JClass generate(JavaWeaver weaver, String name, CtMethod adapterMethod, + CtMethod targetMethod, boolean reuseIfExists) { validateTransformerMethod(adapterMethod); @@ -92,7 +95,7 @@ public static JClass generate(String name, CtMethod adapterMethod, CtMetho } addSuperAdaptInvocation(factory, adaptMethod); - JClass jClass = SelectUtils.node2JoinPoint(mainType, c -> JClass.newInstance(c, cu)); + JClass jClass = SelectUtils.node2JoinPoint(mainType, c -> JClass.newInstance(c, cu, weaver)); return jClass; } @@ -126,8 +129,7 @@ private static CtInvocation generateInvokeAdaptStmt(Factory factory, CtMe CtInvocation invoke = factory.Code().createInvocation(adapterClassAccess, adapterRef); invoke.addArgument(factory.Code().createVariableRead(mvParam.getReference(), false)); invoke.addArgument(factory.Code().createVariableRead(accessParam.getReference(), false)); - // CtReturn returnStmt = factory.Core().createReturn(); - // returnStmt.setReturnedExpression(invoke); + method.getBody().addStatement(invoke); return invoke; } @@ -177,7 +179,6 @@ private static void processParameter(CtParameter param, CtClass mainTy private static void generateConstructor(CtMethod targetMethod, Factory factory, CtClass mainType) { // Create the constructor - // CtSuperAccess createSuperAccess = factory.Core().createSuperAccess(); CtExecutableReference superConstrRef; try { superConstrRef = factory.Constructor() @@ -194,7 +195,6 @@ private static void generateConstructor(CtMethod targetMethod, Factory factor CtLiteral literalMethodName = factory.Code().createLiteral(targetMethod.getSimpleName()); CtInvocation superInvoke = factory.Code().createInvocation(null, superConstrRef, targetClassAccess, literalMethodName); - // CtBlock constrBody = factory.Code().createCtBlock(superInvoke); CtConstructor adaptConstr = factory.Constructor().create(mainType, publicMod, Collections.emptyList(), Collections.emptySet(), factory.Core().createBlock()); @@ -206,12 +206,6 @@ private static void validateTransformerMethodAux(CtMethod adaptMethodNode) { CtTypeReference mVType = factory.Type().createReference(MethodVisitor.class); CtTypeReference intType = factory.Type().integerPrimitiveType(); - // First verify if return type is void -> can be anything, doesn't matter - // if (!adaptMethodNode.getType().isAssignableFrom(byteArrayType)) { - // throw new JavaWeaverException( - // "The adapt method must return byte[], i.e., an array of bytes of the new class"); - // } - List> parameters = adaptMethodNode.getParameters(); // Verify if num args >= 2 if (parameters.size() < 2) { @@ -226,13 +220,12 @@ private static void validateTransformerMethodAux(CtMethod adaptMethodNode) { if (!actualMVType.isSubtypeOf(mVType)) { throw new JavaWeaverException( "The first argument of adapt method is not of type " + MethodVisitor.class.getName());// + ".\n" + - // "The adapt method must have at least two arguments: MethodVisitor mv, int access"); } + // Second argument should be of type byte[] if (!accessType.isSubtypeOf(intType)) { throw new JavaWeaverException( "The second argument of adapt method is not of type int.");// \n" + - // "The adapt method must have at least two arguments: MethodVisitor mv, int access"); } } diff --git a/JavaWeaver/src/weaver/utils/generators/FunctionalClassGenerator.java b/JavaWeaver/src/weaver/utils/generators/FunctionalClassGenerator.java index 8a49dfd3..641b4932 100644 --- a/JavaWeaver/src/weaver/utils/generators/FunctionalClassGenerator.java +++ b/JavaWeaver/src/weaver/utils/generators/FunctionalClassGenerator.java @@ -39,6 +39,7 @@ import spoon.reflect.reference.CtParameterReference; import spoon.reflect.reference.CtTypeReference; import tdrc.utils.StringUtils; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.agent.asm.ASMUtils; import weaver.kadabra.agent.asm.MethodBuilder; import weaver.kadabra.exceptions.JavaWeaverException; @@ -48,15 +49,15 @@ public class FunctionalClassGenerator { /** - * Generates a method that invokes the methodbuilder inside a {@link MethodBuilder} lambda and then returns an - * invokation to ASMUtils. + * Generates a method that invokes the methodbuilder inside a + * {@link MethodBuilder} lambda and then returns an invokation to ASMUtils. * * @param funcInterfaceMethod * @param methodBuilder * @param newMethodOwner * @return */ - public static JMethod generate(CtMethod funcInterfaceMethod, CtMethod methodBuilder, + public static JMethod generate(JavaWeaver weaver, CtMethod funcInterfaceMethod, CtMethod methodBuilder, CtClass newMethodOwner) { validateTransformerMethod(methodBuilder); @@ -80,7 +81,7 @@ public static JMethod generate(CtMethod funcInterfaceMethod, CtMethod m newMethod.getBody().addStatement(builderVar); newMethod.getBody().addStatement(returnStmt); - return JMethod.newInstance(newMethod); + return JMethod.newInstance(newMethod, weaver); } public static CtReturn generateReturnStmt(CtMethod methodBuilder, CtMethod funcInterfaceMethod, @@ -109,9 +110,6 @@ public static CtReturn generateReturnStmt(CtMethod methodBuilder, CtMe arguments.add(factory.Code().createLiteral(funcInterfaceMethod.getSimpleName())); // return type - // CtTypeReference typeRef = funcInterfaceMethod.getType(); - // CtFieldReference> classRef = factory.Field().createReference(typeRef, classRef, - // classFieldName); arguments.add(generateClassFieldAccess(funcInterfaceMethod.getType())); for (CtParameter param : funcInterfaceMethod.getParameters()) { arguments.add(generateClassFieldAccess(param.getType())); @@ -121,13 +119,6 @@ public static CtReturn generateReturnStmt(CtMethod methodBuilder, CtMe returnStmt.setReturnedExpression(invocation); return returnStmt; } - // - // public static CtTypeReference getDeclaratorTypeRef(CtMethod funcInterfaceMethod) { - // CtTypeReference ref; - // ref = funcInterfaceMethod.getFactory().Type() - // .createReference(funcInterfaceMethod.getDeclaringType().getQualifiedName()); - // return ref; - // } public static CtVariableAccess> generateClassFieldAccess(CtTypeReference typeRef) { @@ -216,15 +207,8 @@ private static void validateTransformerMethod(CtMethod methodBuilder) { private static void validateTransformerMethodAux(CtMethod methodBuilder) { Factory factory = methodBuilder.getFactory(); - // CtTypeReference voidType = factory.Type().voidPrimitiveType(); CtTypeReference methodVisitorType = factory.Type().createReference(MethodVisitor.class); - // First verify if return type is void - this is not a problem since we ignore the return type - // if (!methodBuilder.getType().isAssignableFrom(voidType)) { - // throw new JavaWeaverException( - // "The method builder must have void return"); - // } - List> parameters = methodBuilder.getParameters(); // Verify if num args >= 2 if (parameters.size() < 1) { diff --git a/JavaWeaver/src/weaver/utils/weaving/ActionUtils.java b/JavaWeaver/src/weaver/utils/weaving/ActionUtils.java index 7ca443e8..8b64eede 100644 --- a/JavaWeaver/src/weaver/utils/weaving/ActionUtils.java +++ b/JavaWeaver/src/weaver/utils/weaving/ActionUtils.java @@ -25,6 +25,7 @@ import spoon.reflect.factory.Factory; import spoon.reflect.factory.MethodFactory; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.exceptions.JavaWeaverException; import weaver.kadabra.spoon.extensions.launcher.JWEnvironment; @@ -53,7 +54,7 @@ public static Location getLocation(String location) { } public static AJavaWeaverJoinPoint insert(String position, CtElement newElement, - final CtElement node) { + final CtElement node, JavaWeaver weaver) { Location posIntert = Location.valueOf(position.toUpperCase()); if (posIntert.equals(Location.REPLACE) && newElement == null) { @@ -69,30 +70,18 @@ public static AJavaWeaverJoinPoint insert(String position, CtElement newElement, switch (Location.getLocation(position)) { case BEFORE: if (!(newElement instanceof CtStatement)) { - // // If new element is a KadabraSnippet, convert to StatementSnippet - // if (newElement instanceof CtKadabraSnippetElement) { - // newElement = SnippetFactory.createSnippetStatement( - // ((CtKadabraSnippetElement) newElement).getValue(), node.getFactory()); - // } else { KadabraLog.info("Can only insert statements before nodes, tried to insert a '" + newElement.getClass() + "':" + newElement); return null; - // } } referenceStmt.insertBefore((CtStatement) newElement); break; case AFTER: if (!(newElement instanceof CtStatement)) { - // // If new element is a KadabraSnippet, convert to StatementSnippet - // if (newElement instanceof CtKadabraSnippetElement) { - // newElement = SnippetFactory.createSnippetStatement( - // ((CtKadabraSnippetElement) newElement).getValue(), node.getFactory()); - // } else { KadabraLog.info("Can only insert statements after nodes, tried to insert a '" + newElement.getClass() + "': " + newElement); return null; - // } } referenceStmt.insertAfter((CtStatement) newElement); break; @@ -113,62 +102,34 @@ public static AJavaWeaverJoinPoint insert(String position, CtElement newElement, + "; used '" + position + "'"); } - var joinPoint = CtElement2JoinPoint.convert(newElement); + var joinPoint = CtElement2JoinPoint.convert(newElement, weaver); return joinPoint; } /** * Inject code before/after/around a given statement *

- * NOTE: this method searches for a parent statement (or the given node) that has a block as its parent + * NOTE: this method searches for a parent statement (or the given node) + * that has a block as its parent * * @param position position of the insertion: before, after or around * @param snippetStr the code to inject * @param node the node used as reference for the insertion */ - // public static void insert(String position, String snippetStr, CtStatement statement) { - // - // final CtElement parent = statement.getParent(); - public static AJavaWeaverJoinPoint insert(String position, String snippetStr, CtElement node) { + public static AJavaWeaverJoinPoint insert(String position, String snippetStr, CtElement node, JavaWeaver weaver) { var snippet = snippetStr.trim().isEmpty() ? null : SnippetFactory.createSnippetStatement(snippetStr, node.getFactory()); - // - // var snippet = snippetStr.trim().isEmpty() ? null - // : SnippetFactory.createSnippetElement(node.getFactory(), snippetStr); if (snippet == null) { SpecsCheck.checkArgument(Location.valueOf(position.toUpperCase()).equals(Location.REPLACE), () -> "Can only use empty string as insert argument when it is a 'replace'"); } - return insert(position, snippet, node); - - /* - Location posIntert = Location.valueOf(position.toUpperCase()); - if (posIntert.equals(Location.REPLACE) && snippetStr.trim().isEmpty()) { - // Then it is just to remove the given element - node.delete(); - return null; - } - final CtCodeSnippetStatement snippet = SnippetFactory.createSnippetStatement(snippetStr, node.getFactory()); - final CtStatement parent = SpoonUtils.getInsertableParent(node); - insert(position, snippet, parent); - String[] lines = snippetStr.split("\r\n|\r|\n"); - reportLOCs(weavingProfiler, lines.length, true); - - return CtElement2JoinPoint.convert(snippet); - // return SelectUtils.node2JoinPoint(snippet, JSnippet::newInstance); - - // snippet.setParent(parent); <-- get parent of parent for this, if not dealt by spoon - // System.out.println("injected"); - // This also helps to avoid the warning: - // WARN spoon.support.StandardEnvironment - warning: ignoring - // inconsistent parent for CtCodeSnippetStatementImpl - - */ + return insert(position, snippet, node, weaver); } - public static AJavaWeaverJoinPoint replaceExpression(String position, String snippetStr, CtExpression node) { + public static AJavaWeaverJoinPoint replaceExpression(String position, String snippetStr, CtExpression node, + JavaWeaver weaver) { var snippet = snippetStr.trim().isEmpty() ? null : SnippetFactory.createSnippetExpression(node.getFactory(), snippetStr); @@ -178,26 +139,11 @@ public static AJavaWeaverJoinPoint replaceExpression(String position, String () -> "Can only use empty string as an expression insert argument when it is a 'replace'"); } - return replaceExpression(position, snippet, node); - /* - Location posIntert = Location.valueOf(position.toUpperCase()); - if (posIntert.equals(Location.REPLACE) && snippetStr.trim().isEmpty()) { - // Then it is just to remove the given element - node.delete(); - return null; - } - final CtCodeSnippetExpression snippet = SnippetFactory.createSnippetExpression(node.getFactory(), - snippetStr); - node.replace(snippet); - String[] lines = snippetStr.split("\r\n|\r|\n"); - reportLOCs(weaverProfiler, lines.length, true); - - return CtElement2JoinPoint.convert(snippet); - */ + return replaceExpression(position, snippet, node, weaver); } public static AJavaWeaverJoinPoint replaceExpression(String position, CtExpression expression, - CtExpression target) { + CtExpression target, JavaWeaver weaver) { CtElement snippet = expression; CtElement node = target; @@ -209,52 +155,39 @@ public static AJavaWeaverJoinPoint replaceExpression(String position, CtExpr return null; } - // var snippet2 = SnippetFactory.createSnippetStatement(snippet.toString(), node.getFactory()); - // var snippet2 = SnippetFactory.createSnippetExpression(node.getFactory(), snippet.toString()); - // node.replace(snippet2); - // System.out.println("NODE: " + node); - // System.out.println("PARENT INIT:" + node.isParentInitialized()); - // Special case if expression is a block statement if (SpoonUtils.isStatementInBlock(node)) { var code = snippet.toString(); snippet = SnippetFactory.createSnippetStatement(code, node.getFactory()); - // System.out.println("SPECIAL"); } node.replace(snippet); - // System.out.println("SNIPPET INIT:" + snippet.isParentInitialized()); - // System.out.println("SNIPPET: " + snippet.getClass()); - - // Removes parent from original node - // Dropped - apparently Spoon nodes do not loose their parents - // node.setParent(null); - - var joinPoint = CtElement2JoinPoint.convert(snippet); + var joinPoint = CtElement2JoinPoint.convert(snippet, weaver); return joinPoint; } /** - * Use this method to insert arbitrary code around a CtTypeMember: methods, fields, constructors, innerTypes, and - * anonymous executables + * Use this method to insert arbitrary code around a CtTypeMember: methods, + * fields, constructors, innerTypes, and anonymous executables * * @param referenceNode * @param codeSnippet * @param location * @param weavingProfiler */ - public static AJavaWeaverJoinPoint insertMember(CtElement referenceNode, String codeSnippet, String location) { + public static AJavaWeaverJoinPoint insertMember(CtElement referenceNode, String codeSnippet, String location, + JavaWeaver weaver) { Factory factory = referenceNode.getFactory(); - // CtCodeSnippetStatement snippet = SnippetFactory.createSnippetStatement(codeSnippet, factory); CtKadabraSnippetElement snippet = SnippetFactory.createSnippetElement(factory, codeSnippet); - return insertMember(referenceNode, snippet, location); + return insertMember(referenceNode, snippet, location, weaver); } - public static AJavaWeaverJoinPoint insertMember(CtElement referenceNode, CtElement snippet, String location) { + public static AJavaWeaverJoinPoint insertMember(CtElement referenceNode, CtElement snippet, String location, + JavaWeaver weaver) { location = location.toUpperCase(); Factory factory = referenceNode.getFactory(); @@ -262,7 +195,6 @@ public static AJavaWeaverJoinPoint insertMember(CtElement referenceNode, CtEleme switch (Location.getLocation(location)) { case BEFORE: - // AnnotationsTable.getStaticTable().addBefore(referenceNode, snippet); env.getTable().addBefore(referenceNode, snippet); break; case AFTER: @@ -270,30 +202,18 @@ public static AJavaWeaverJoinPoint insertMember(CtElement referenceNode, CtEleme break; case AROUND: case REPLACE: - - // System.out.println("PARENT: " + referenceNode.getParent().getClass()); - // System.out.println("REPLACING WITH '" + snippet + "'"); - // // Insert before node - // env.getTable().addBefore(referenceNode, snippet); - // - // // Set same parent - // snippet.setParent(referenceNode.getParent()); - // - // // Remove node from tree - // referenceNode.replace(Collections.emptyList()); - env.getTable().addReplace(referenceNode, snippet); - break; default: throw new RuntimeException("Code insertion must only be done: " + Arrays.toString(Location.values()) + "; used '" + location + "'"); } - return CtElement2JoinPoint.convert(snippet); + return CtElement2JoinPoint.convert(snippet, weaver); } - public static AJavaWeaverJoinPoint insertInTable(CtElement referenceNode, String codeSnippet, String location) { + public static AJavaWeaverJoinPoint insertInTable(CtElement referenceNode, String codeSnippet, String location, + JavaWeaver weaver) { location = location.toUpperCase(); Factory factory = referenceNode.getFactory(); @@ -301,7 +221,6 @@ public static AJavaWeaverJoinPoint insertInTable(CtElement referenceNode, String CtCodeSnippetStatement snippet = SnippetFactory.createSnippetStatement(codeSnippet, factory); switch (Location.getLocation(location)) { case BEFORE: - // AnnotationsTable.getStaticTable().addBefore(referenceNode, snippet); env.getTable().addBefore(referenceNode, snippet); break; case AFTER: @@ -316,11 +235,11 @@ public static AJavaWeaverJoinPoint insertInTable(CtElement referenceNode, String + "; used '" + location + "'"); } - return CtElement2JoinPoint.convert(snippet); + return CtElement2JoinPoint.convert(snippet, weaver); } public static CtInterface compilationUnitWithInterface(String name, String[] _extends, File outputDir, - Factory factory) { + Factory factory) { CtCompilationUnit cu = newCompilationUnit(name, outputDir, factory); @@ -358,7 +277,7 @@ public static CtInterface newInterface(String name, String[] _extends, F } public static CtCompilationUnit compilationUnitWithClass(String name, String extend, String[] _implements, - File outputDir, Factory factory) { + File outputDir, Factory factory) { final CtClass newClass = newClass(name, extend, _implements, factory); CtCompilationUnit cu = newCompilationUnit(name, outputDir, factory); cu.addDeclaredType(newClass); @@ -387,19 +306,18 @@ private static CtCompilationUnit newCompilationUnit(String name, File outputDir, String property = System.getProperty("file.separator"); String filePath = new File(outputDir, name.replace(".", property) + ".java").getAbsolutePath(); - // return compilationUnitF.create(filePath); return compilationUnitF.getOrCreate(filePath); } public static CtField newField(CtType node, String name, String fieldType, String initialValue, - String[] modifiers) { + String[] modifiers) { final Factory factory = node.getFactory(); final CtTypeReference fieldTypeRef = TypeUtils.typeOf(fieldType, factory); return newFieldWithSnippet(node, name, fieldTypeRef, initialValue, modifiers); } public static CtField newFieldWithType(CtType node, String baseName, CtTypeReference fieldType, - T initialValue, String[] modifiers) { + T initialValue, String[] modifiers) { CtExpression init = null; if (initialValue != null) { init = SpoonUtils.createLiteral(initialValue, node.getFactory()); @@ -408,19 +326,18 @@ public static CtField newFieldWithType(CtType node, String baseName, C } public static CtField newFieldWithType(CtType node, String baseName, CtTypeReference fieldType, - CtExpression initialValue, - String[] modifiers) { + CtExpression initialValue, + String[] modifiers) { final CtField newField = createField(node, baseName, fieldType, modifiers); if (initialValue != null) { - // CtExpression init = node.getFactory().Code().createLiteral(initialValue); newField.setDefaultExpression(initialValue); } return newField; } public static CtField newFieldWithSnippet(CtType node, String baseName, CtTypeReference fieldType, - String initialValue, - String[] modifiers) { + String initialValue, + String[] modifiers) { final CtField newField = createField(node, baseName, fieldType, modifiers); if (initialValue != null) { final CtExpression snippet = SnippetFactory.snippetExpression(initialValue.toString(), @@ -431,7 +348,7 @@ public static CtField newFieldWithSnippet(CtType node, String baseName } private static CtField createField(CtType node, String baseName, CtTypeReference fieldType, - String[] modifiers) { + String[] modifiers) { final Set modifiersSet = SpoonUtils.setOfModifiers(modifiers, ModifierKind.PRIVATE); String name = baseName; @@ -447,8 +364,9 @@ private static CtField createField(CtType node, String baseName, CtTyp return newField; } - public static CtMethod newMethod(CtType node, String name, String returnType, String[] paramLeft, String[] paramRight, - String[] modifiers, String code) { + public static CtMethod newMethod(CtType node, String name, String returnType, String[] paramLeft, + String[] paramRight, + String[] modifiers, String code) { final Factory factory = node.getFactory(); final MethodFactory methodF = factory.Method(); final CtTypeReference returnTypeRef = TypeUtils.typeOf(returnType, factory); @@ -458,10 +376,10 @@ public static CtMethod newMethod(CtType node, String name, String ret // Current Best approach for inserting parameters in a method and // directly associate to parent method - SpecsCheck.checkArgument(paramLeft.length == paramRight.length, () -> "Param left and param right must have same size"); + SpecsCheck.checkArgument(paramLeft.length == paramRight.length, + () -> "Param left and param right must have same size"); for (int i = 0; i < paramLeft.length; i++) { - // final CtTypeReference typeRef = factory.Type().createReference(pair.getLeft()); final CtTypeReference typeRef = TypeUtils.typeOf(paramLeft[i], factory); methodF.createParameter(newMethod, typeRef, paramRight[i]); @@ -475,13 +393,15 @@ public static CtMethod newMethod(CtType node, String name, String ret return newMethod; } - public static CtConstructor newConstructor(CtClass node, String[] paramLeft, String[] paramRight, String[] modifiers) { + public static CtConstructor newConstructor(CtClass node, String[] paramLeft, String[] paramRight, + String[] modifiers) { final Factory factory = node.getFactory(); final Set modifiersSet = SpoonUtils.setOfModifiers(modifiers, ModifierKind.PUBLIC); ConstructorFactory constFac = factory.Constructor(); CtConstructor constr = constFac.create(node, modifiersSet, Collections.emptyList(), null); - SpecsCheck.checkArgument(paramLeft.length == paramRight.length, () -> "Param left and param right must have same size"); + SpecsCheck.checkArgument(paramLeft.length == paramRight.length, + () -> "Param left and param right must have same size"); for (int i = 0; i < paramLeft.length; i++) { final CtTypeReference typeRef = factory.Type().createReference(paramLeft[i]); @@ -496,7 +416,7 @@ public static N cloneElement(N node) { } public static JP cloneJP(N node, - NodeConverter converter) { + NodeConverter converter) { N newNode = node.getFactory().Core().clone(node); return converter.toJoinPoint(newNode); diff --git a/JavaWeaver/src/weaver/utils/weaving/SelectUtils.java b/JavaWeaver/src/weaver/utils/weaving/SelectUtils.java index 014682bc..96915c70 100644 --- a/JavaWeaver/src/weaver/utils/weaving/SelectUtils.java +++ b/JavaWeaver/src/weaver/utils/weaving/SelectUtils.java @@ -22,6 +22,7 @@ import spoon.reflect.code.CtStatement; import spoon.reflect.code.CtVariableAccess; import spoon.reflect.declaration.CtElement; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.ACall; import weaver.kadabra.abstracts.joinpoints.AExpression; @@ -42,22 +43,24 @@ public class SelectUtils { /** - * Select an element of type J, from a starting element, and convert the element into a join point of type J - * + * Select an element of type J, from a starting element, and convert the element + * into a join point of type J + * * @param startNode * @param searchClass * @param converter * @return */ public static List select(CtElement startNode, - Class searchClass, NodeConverter converter) { + Class searchClass, NodeConverter converter) { return SelectUtils.select(startNode, searchClass, converter, Collections.emptyList(), Collections.emptyList()); } /** - * Select an element of type J, from a starting element, and convert the element into a join point of type J - * + * Select an element of type J, from a starting element, and convert the element + * into a join point of type J + * * @param startNode * @param searchClass * @param converter @@ -65,10 +68,9 @@ public static List se * @return */ public static List select(CtElement startNode, - Class searchClass, NodeConverter converter, Collection> ignore, - Collection> prune) { + Class searchClass, NodeConverter converter, Collection> ignore, + Collection> prune) { return NodeSearcher.searchAndConvert(searchClass, startNode, converter, ignore, prune); - } /** @@ -87,15 +89,8 @@ public static List node return joinPoints; } - /** - * Convert a list of {@link CtStatement} to a list of join points of type {@link AStatement} - * - * @param element - * @param converter - * @return - */ public static List node2JoinPointList(T element, - NodeConverter converter) { + NodeConverter converter) { final V joinPoint = SelectUtils.node2JoinPoint(element, converter); final List joinPoints = SpecsCollections.newArrayList(); @@ -105,44 +100,40 @@ public static List node } public static List expression2JoinPointList( - CtExpression element) { + CtExpression element, JavaWeaver weaver) { - final AExpression joinPoint = SelectUtils.expression2JoinPoint(element); + final AExpression joinPoint = SelectUtils.expression2JoinPoint(element, weaver); final List joinPoints = SpecsCollections.newArrayList(); joinPoints.add(joinPoint); return joinPoints; } - public static AExpression expression2JoinPoint(CtExpression element) { - - return JExpression.newInstance(element); + public static AExpression expression2JoinPoint(CtExpression element, JavaWeaver weaver) { + return JExpression.newInstance(element, weaver); } - public static AJavaWeaverJoinPoint statement2JoinPoint(CtStatement element) { - - return JStatement.newInstance(element); + public static AJavaWeaverJoinPoint statement2JoinPoint(CtStatement element, JavaWeaver weaver) { + return JStatement.newInstance(element, weaver); } public static V node2JoinPoint(T element, - NodeConverter converter) { + NodeConverter converter) { return converter.toJoinPoint(element); } - public static List selectVar(CtStatement node) { - // List> ignoreTypes = SpecsCollections.newArrayList(); - // ignoreTypes.add(CtFieldReference.class); + public static List selectVar(CtStatement node, JavaWeaver weaver) { List> ignoreTypes = SpecsCollections.newArrayList(); - // ignoreTypes.add(CtFieldReference.class); List> prune = SpecsCollections.newArrayList(); - // prune.add(CtFieldAccess.class); - List select = select(node, CtVariableAccess.class, JVar::newInstance, ignoreTypes, prune); + List select = select(node, CtVariableAccess.class, (var -> JVar.newInstance(var, weaver)), ignoreTypes, + prune); return select; } - public static List selectCall(CtElement node) { - final List> calls = SelectUtils.select(node, CtInvocation.class, JCall::newInstance); + public static List selectCall(CtElement node, JavaWeaver weaver) { + final List> calls = SelectUtils.select(node, CtInvocation.class, + (call -> JCall.newInstance(call, weaver))); // Filter constructors return calls.stream() @@ -152,7 +143,8 @@ public static List selectCall(CtElement node) { public static List selectLibClasses(JApp app) { Set allClassesInfo = getAllClassesInfo(app); - List libClasses = allClassesInfo.stream().map(JLibClass::newInstance) + List libClasses = allClassesInfo.stream() + .map(libClass -> JLibClass.newInstance(libClass, app.getWeaverEngine())) .collect(Collectors.toList()); return libClasses; diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java index cb9d5389..2d9b1804 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java @@ -13,19 +13,40 @@ package weaver.utils.weaving.converters; -import pt.up.fe.specs.util.classmap.FunctionClassMap; -import spoon.reflect.code.*; -import spoon.reflect.declaration.*; +import java.lang.reflect.Array; +import java.util.List; +import java.util.Optional; + +import pt.up.fe.specs.util.classmap.BiFunctionClassMap; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtCatch; +import spoon.reflect.code.CtComment; +import spoon.reflect.code.CtExpression; +import spoon.reflect.code.CtStatement; +import spoon.reflect.declaration.CtCompilationUnit; +import spoon.reflect.declaration.CtElement; +import spoon.reflect.declaration.CtEnumValue; +import spoon.reflect.declaration.CtExecutable; +import spoon.reflect.declaration.CtField; +import spoon.reflect.declaration.CtType; +import spoon.reflect.declaration.CtVariable; import spoon.reflect.reference.CtReference; import spoon.reflect.reference.CtTypeReference; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; -import weaver.kadabra.joinpoints.*; +import weaver.kadabra.joinpoints.JApp; +import weaver.kadabra.joinpoints.JBody; +import weaver.kadabra.joinpoints.JCatch; +import weaver.kadabra.joinpoints.JComment; +import weaver.kadabra.joinpoints.JDeclaration; +import weaver.kadabra.joinpoints.JEnumValue; +import weaver.kadabra.joinpoints.JField; +import weaver.kadabra.joinpoints.JFile; +import weaver.kadabra.joinpoints.JGenericJoinPoint; +import weaver.kadabra.joinpoints.JReference; +import weaver.kadabra.joinpoints.JTypeReference; import weaver.kadabra.spoon.extensions.nodes.CtApp; -import java.lang.reflect.Array; -import java.util.List; -import java.util.Optional; - /** * Converts a given element to the correct Join point type * @@ -33,16 +54,9 @@ * */ public class CtElement2JoinPoint { - private static final FunctionClassMap CONVERTER = new FunctionClassMap<>( - JGenericJoinPoint::newInstance); + private static final BiFunctionClassMap CONVERTER = new BiFunctionClassMap<>(); static { - - // CONVERTER.put(CtInterface.class, JInterface::newInstance); - // CONVERTER.put(CtClass.class, JClass::newInstance); - // CONVERTER.put(CtMethod.class, JMethod::newInstance); - // CONVERTER.put(CtConstructor.class, JConstructor::newInstance); - // Elements without specific converter CONVERTER.put(CtCatch.class, JCatch::new); CONVERTER.put(CtBlock.class, JBody::newInstance); @@ -61,43 +75,42 @@ public class CtElement2JoinPoint { CONVERTER.put(CtTypeReference.class, JTypeReference::newInstance); CONVERTER.put(CtReference.class, JReference::newInstance); - // CONVERTER.setDefaultFunction(element -> null); - /**/ - CONVERTER.setDefaultFunction(JGenericJoinPoint::newInstance); + CONVERTER.put(CtElement.class, CtElement2JoinPoint::defaultFactory); } - public static AJavaWeaverJoinPoint convert(CtElement element) { + public static AJavaWeaverJoinPoint defaultFactory(CtElement element, JavaWeaver weaver) { + return JGenericJoinPoint.newInstance(element, weaver); + } + + public static AJavaWeaverJoinPoint convert(CtElement element, JavaWeaver weaver) { if (element == null) { return null; } - return CONVERTER.apply(element); + return CONVERTER.apply(element, weaver); } - public static T convert(CtElement element, Class jpClass) { - var jp = convert(element); - // var jp = CONVERTER.apply(element); + public static T convert(CtElement element, JavaWeaver weaver, Class jpClass) { + var jp = convert(element, weaver); return jpClass.cast(jp); } - public static Optional convertTry(CtElement element) { + public static Optional convertTry(CtElement element, JavaWeaver weaver) { try { - return Optional.ofNullable(CONVERTER.apply(element)); + return Optional.ofNullable(CONVERTER.apply(element, weaver)); } catch (Exception e) { return Optional.empty(); } - } public static T[] convertList(List elements, - Class jpClass) { + JavaWeaver weaver, Class jpClass) { @SuppressWarnings("unchecked") T[] jps = (T[]) Array.newInstance(jpClass, elements.size()); - // T[] jps = (T[]) new AJavaWeaverJoinPoint[elements.size()]; for (int i = 0; i < elements.size(); i++) { - jps[i] = convert(elements.get(i), jpClass); + jps[i] = convert(elements.get(i), weaver, jpClass); } return jps; diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtExecutable2AExecutable.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtExecutable2AExecutable.java index e65ce734..fba496be 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtExecutable2AExecutable.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtExecutable2AExecutable.java @@ -13,11 +13,12 @@ package weaver.utils.weaving.converters; -import pt.up.fe.specs.util.classmap.FunctionClassMap; +import pt.up.fe.specs.util.classmap.BiFunctionClassMap; import spoon.reflect.declaration.CtAnonymousExecutable; import spoon.reflect.declaration.CtConstructor; import spoon.reflect.declaration.CtExecutable; import spoon.reflect.declaration.CtMethod; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AExecutable; import weaver.kadabra.joinpoints.JAnonymousExec; import weaver.kadabra.joinpoints.JConstructor; @@ -31,20 +32,23 @@ * */ public class CtExecutable2AExecutable { - private static final FunctionClassMap, AExecutable> CONVERTER = new FunctionClassMap<>( - JExecutable::newInstance); + private static final BiFunctionClassMap, JavaWeaver, AExecutable> CONVERTER = new BiFunctionClassMap<>(); static { CONVERTER.put(CtMethod.class, JMethod::newInstance); CONVERTER.put(CtConstructor.class, JConstructor::newInstance); CONVERTER.put(CtAnonymousExecutable.class, JAnonymousExec::newInstance); + CONVERTER.put(CtExecutable.class, CtExecutable2AExecutable::defaultFactory); + } + + public static AExecutable defaultFactory(CtExecutable element, JavaWeaver weaver) { + return JExecutable.newInstance(element, weaver); } // Package protected so only CtElement2JoinPoint can use this method - public static AExecutable convert(CtExecutable element) { - AExecutable converted = CONVERTER.apply(element); + public static AExecutable convert(CtExecutable element, JavaWeaver weaver) { + AExecutable converted = CONVERTER.apply(element, weaver); return converted; - } } diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtExpression2AExpression.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtExpression2AExpression.java index cd8f5f85..f5c37f1e 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtExpression2AExpression.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtExpression2AExpression.java @@ -13,13 +13,37 @@ package weaver.utils.weaving.converters; -import pt.up.fe.specs.util.classmap.FunctionClassMap; -import spoon.reflect.code.*; +import pt.up.fe.specs.util.classmap.BiFunctionClassMap; +import spoon.reflect.code.CtArrayAccess; +import spoon.reflect.code.CtBinaryOperator; +import spoon.reflect.code.CtConditional; +import spoon.reflect.code.CtConstructorCall; +import spoon.reflect.code.CtExpression; +import spoon.reflect.code.CtFieldAccess; +import spoon.reflect.code.CtInvocation; +import spoon.reflect.code.CtLiteral; +import spoon.reflect.code.CtThisAccess; +import spoon.reflect.code.CtUnaryOperator; +import spoon.reflect.code.CtVariableAccess; import spoon.reflect.declaration.CtAnnotation; import spoon.support.reflect.code.CtCodeSnippetExpressionImpl; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.abstracts.joinpoints.AExpression; -import weaver.kadabra.joinpoints.*; +import weaver.kadabra.joinpoints.JAnnotation; +import weaver.kadabra.joinpoints.JArrayAccess; +import weaver.kadabra.joinpoints.JBinaryExpression; +import weaver.kadabra.joinpoints.JCall; +import weaver.kadabra.joinpoints.JCallStatement; +import weaver.kadabra.joinpoints.JExpression; +import weaver.kadabra.joinpoints.JFieldAccess; +import weaver.kadabra.joinpoints.JLiteral; +import weaver.kadabra.joinpoints.JNew; +import weaver.kadabra.joinpoints.JSnippetExpr; +import weaver.kadabra.joinpoints.JTernary; +import weaver.kadabra.joinpoints.JThis; +import weaver.kadabra.joinpoints.JUnaryExpression; +import weaver.kadabra.joinpoints.JVar; import weaver.kadabra.spoon.extensions.nodes.CtKadabraSnippetExpression; import weaver.utils.SpoonUtils; @@ -30,15 +54,12 @@ * */ public class CtExpression2AExpression { - private static final FunctionClassMap, AExpression> CONVERTER = new FunctionClassMap<>( - JExpression::newInstanceDefault); + private static final BiFunctionClassMap, JavaWeaver, AExpression> CONVERTER = new BiFunctionClassMap<>(); static { CONVERTER.put(CtBinaryOperator.class, JBinaryExpression::newInstance); CONVERTER.put(CtUnaryOperator.class, JUnaryExpression::newInstance); - // CONVERTER.put(CtInvocation.class, JCall::newInstance); - // CONVERTER.put(CtInvocation.class, CtExpression2AExpression::ctInvokation); CONVERTER.put(CtFieldAccess.class, JFieldAccess::newInstance); CONVERTER.put(CtVariableAccess.class, JVar::newInstance); CONVERTER.put(CtArrayAccess.class, JArrayAccess::newInstance); @@ -48,58 +69,53 @@ public class CtExpression2AExpression { CONVERTER.put(CtAnnotation.class, JAnnotation::new); CONVERTER.put(CtThisAccess.class, JThis::new); CONVERTER.put(CtCodeSnippetExpressionImpl.class, - ctElement -> JSnippetExpr.newInstance(new CtKadabraSnippetExpression(ctElement))); - - // CONVERTER.put(CtAssignment.class, JAssignment::newInstance); + (ctElement, weaver) -> JSnippetExpr.newInstance(new CtKadabraSnippetExpression(ctElement), + weaver)); + CONVERTER.put(CtExpression.class, CtExpression2AExpression::defaultFactory); + } - // CONVERTER_EXPR.putAll(CONVERTER); + public static AExpression defaultFactory(CtExpression element, JavaWeaver weaver) { + return JExpression.newInstanceDefault(element, weaver); } - private static final FunctionClassMap, AExpression> CONVERTER_EXPR = new FunctionClassMap<>( + private static final BiFunctionClassMap, JavaWeaver, AExpression> CONVERTER_EXPR = new BiFunctionClassMap<>( CONVERTER); static { CONVERTER_EXPR.put(CtInvocation.class, JCall::newInstance); } - private static final FunctionClassMap, AJavaWeaverJoinPoint> CONVERTER_GENERAL = new FunctionClassMap<>( + private static final BiFunctionClassMap, JavaWeaver, AJavaWeaverJoinPoint> CONVERTER_GENERAL = new BiFunctionClassMap<>( CONVERTER); static { CONVERTER_GENERAL.put(CtInvocation.class, CtExpression2AExpression::ctInvokation); - //CONVERTER_GENERAL.put(CtInvocation.class, JCall::newInstance); + // CONVERTER_GENERAL.put(CtInvocation.class, JCall::newInstance); } // Package protected so only CtElement2JoinPoint can use this method - public static AExpression convertToExpression(CtExpression element) { - return CONVERTER_EXPR.apply(element); - + public static AExpression convertToExpression(CtExpression element, JavaWeaver weaver) { + return CONVERTER_EXPR.apply(element, weaver); } /** - * Converts the element CtExpression a join point, it does not always return an AExpression (e.g., super(); is a - * AStatement) - * + * Converts the element CtExpression a join point, it does not always return an + * AExpression (e.g., super(); is a AStatement) + * * @param element * @return */ - public static AJavaWeaverJoinPoint convert(CtExpression element) { - return CONVERTER_GENERAL.apply(element); + public static AJavaWeaverJoinPoint convert(CtExpression element, JavaWeaver weaver) { + return CONVERTER_GENERAL.apply(element, weaver); } - // public static AExpression convert(CtExpression element) { - // return CONVERTER.apply(element); - // - // } - - public static AJavaWeaverJoinPoint ctInvokation(CtInvocation call) { - + public static AJavaWeaverJoinPoint ctInvokation(CtInvocation call, JavaWeaver weaver) { // Special case: if call is also a statement, return JCallStatement if (SpoonUtils.isStatementInBlock(call)) { - return new JCallStatement<>(call); + return new JCallStatement<>(call, weaver); } - return JCall.newInstance(call); + return JCall.newInstance(call, weaver); } } diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java index 1fc9445b..6dbeba55 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java @@ -13,10 +13,45 @@ package weaver.utils.weaving.converters; -import pt.up.fe.specs.util.classmap.FunctionClassMap; -import spoon.reflect.code.*; +import pt.up.fe.specs.util.classmap.BiFunctionClassMap; +import spoon.reflect.code.CtAssert; +import spoon.reflect.code.CtAssignment; +import spoon.reflect.code.CtBlock; +import spoon.reflect.code.CtBreak; +import spoon.reflect.code.CtCase; +import spoon.reflect.code.CtComment; +import spoon.reflect.code.CtContinue; +import spoon.reflect.code.CtIf; +import spoon.reflect.code.CtInvocation; +import spoon.reflect.code.CtLocalVariable; +import spoon.reflect.code.CtLoop; +import spoon.reflect.code.CtOperatorAssignment; +import spoon.reflect.code.CtReturn; +import spoon.reflect.code.CtStatement; +import spoon.reflect.code.CtSwitch; +import spoon.reflect.code.CtThrow; +import spoon.reflect.code.CtTry; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; -import weaver.kadabra.joinpoints.*; +import weaver.kadabra.abstracts.joinpoints.AStatement; +import weaver.kadabra.joinpoints.JAssert; +import weaver.kadabra.joinpoints.JAssignment; +import weaver.kadabra.joinpoints.JBody; +import weaver.kadabra.joinpoints.JBreak; +import weaver.kadabra.joinpoints.JCase; +import weaver.kadabra.joinpoints.JComment; +import weaver.kadabra.joinpoints.JContinue; +import weaver.kadabra.joinpoints.JExpressionStatement; +import weaver.kadabra.joinpoints.JIf; +import weaver.kadabra.joinpoints.JLocalVariable; +import weaver.kadabra.joinpoints.JLoop; +import weaver.kadabra.joinpoints.JOpAssignment; +import weaver.kadabra.joinpoints.JReturn; +import weaver.kadabra.joinpoints.JSnippetStmt; +import weaver.kadabra.joinpoints.JStatement; +import weaver.kadabra.joinpoints.JSwitch; +import weaver.kadabra.joinpoints.JThrow; +import weaver.kadabra.joinpoints.JTry; import weaver.kadabra.spoon.extensions.nodes.CtKadabraSnippetStatement; /** @@ -26,16 +61,13 @@ * */ public class CtStatement2AStatement { - private static final FunctionClassMap CONVERTER = new FunctionClassMap<>( - JStatement::new); + private static final BiFunctionClassMap CONVERTER = new BiFunctionClassMap<>(); static { - - CONVERTER.put(CtInvocation.class, CtExpression2AExpression::ctInvokation); + CONVERTER.put(CtInvocation.class, JExpressionStatement::newInstance); CONVERTER.put(CtAssignment.class, JExpressionStatement::newInstance); CONVERTER.put(CtIf.class, JIf::newInstance); CONVERTER.put(CtLoop.class, JLoop::newInstance); - // CONVERTER.put(CtOperatorAssignment.class, JOpAssignmentAux::newInstance); CONVERTER.put(CtAssignment.class, JAssignment::newInstance); CONVERTER.put(CtOperatorAssignment.class, JOpAssignment::new); CONVERTER.put(CtReturn.class, JReturn::newInstance); @@ -50,11 +82,15 @@ public class CtStatement2AStatement { CONVERTER.put(CtCase.class, JCase::newInstance); CONVERTER.put(CtBreak.class, JBreak::newInstance); CONVERTER.put(CtContinue.class, JContinue::newInstance); + CONVERTER.put(CtStatement.class, CtStatement2AStatement::defaultFactory); } - // Package protected so only CtElement2JoinPoint can use this method - public static AJavaWeaverJoinPoint convert(CtStatement element) { - return CONVERTER.apply(element); + public static AStatement defaultFactory(CtStatement element, JavaWeaver weaver) { + return new JStatement(element, weaver); + } + // Package protected so only CtElement2JoinPoint can use this method + public static AJavaWeaverJoinPoint convert(CtStatement element, JavaWeaver weaver) { + return CONVERTER.apply(element, weaver); } } diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtType2AType.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtType2AType.java index 80deac6d..42432c5e 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtType2AType.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtType2AType.java @@ -13,10 +13,11 @@ package weaver.utils.weaving.converters; -import pt.up.fe.specs.util.classmap.FunctionClassMap; +import pt.up.fe.specs.util.classmap.BiFunctionClassMap; import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtInterface; import spoon.reflect.declaration.CtType; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.joinpoints.AType; import weaver.kadabra.joinpoints.JClass; import weaver.kadabra.joinpoints.JInterfaceType; @@ -29,18 +30,20 @@ * */ public class CtType2AType { - private static final FunctionClassMap, AType> CONVERTER = new FunctionClassMap<>( - type -> JType.newInstance(type, null)); + private static final BiFunctionClassMap, JavaWeaver, AType> CONVERTER = new BiFunctionClassMap<>(); static { - CONVERTER.put(CtClass.class, JClass::newInstance); CONVERTER.put(CtInterface.class, JInterfaceType::newInstance); + CONVERTER.put(CtType.class, CtType2AType::defaultFactory); } - // Package protected so only CtElement2JoinPoint can use this method - public static AType convert(CtType element) { - return CONVERTER.apply(element); + public static AType defaultFactory(CtType element, JavaWeaver weaver) { + return JType.newInstance(element, null, weaver); + } + // Package protected so only CtElement2JoinPoint can use this method + public static AType convert(CtType element, JavaWeaver weaver) { + return CONVERTER.apply(element, weaver); } } diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/XmlNode2JoinPoint.java b/JavaWeaver/src/weaver/utils/weaving/converters/XmlNode2JoinPoint.java index 71d3f6e8..9dd8a7f4 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/XmlNode2JoinPoint.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/XmlNode2JoinPoint.java @@ -15,31 +15,37 @@ import java.util.Optional; -import pt.up.fe.specs.util.classmap.FunctionClassMap; +import pt.up.fe.specs.util.classmap.BiFunctionClassMap; import pt.up.fe.specs.util.xml.XmlElement; import pt.up.fe.specs.util.xml.XmlNode; +import weaver.kadabra.JavaWeaver; import weaver.kadabra.abstracts.AJavaWeaverJoinPoint; import weaver.kadabra.joinpoints.JXmlElement; import weaver.kadabra.joinpoints.JXmlNode; public class XmlNode2JoinPoint { - private static final FunctionClassMap CONVERTER = new FunctionClassMap<>( - JXmlNode::new); + private static final BiFunctionClassMap CONVERTER; static { + CONVERTER = new BiFunctionClassMap<>(); + CONVERTER.put(XmlElement.class, JXmlElement::new); + CONVERTER.put(XmlNode.class, XmlNode2JoinPoint::defaultFactory); + } + public static AJavaWeaverJoinPoint defaultFactory(XmlNode node, JavaWeaver weaver) { + return new JXmlNode(node, weaver); } - public static AJavaWeaverJoinPoint convert(XmlNode node) { - return CONVERTER.apply(node); + public static AJavaWeaverJoinPoint convert(XmlNode node, JavaWeaver weaver) { + return CONVERTER.apply(node, weaver); } - public static Optional convertTry(XmlNode node) { + public static Optional convertTry(XmlNode node, JavaWeaver weaver) { try { - return Optional.ofNullable(CONVERTER.apply(node)); + return Optional.ofNullable(CONVERTER.apply(node, weaver)); } catch (Exception e) { return Optional.empty(); } From 6afb22a9f7130aaa803c32d1a1ac02a00fb288cb Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Tue, 13 Jan 2026 01:03:47 +0000 Subject: [PATCH 2/5] Mimic changes made as preparation before merge. --- .../weaver/utils/weaving/converters/CtStatement2AStatement.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java index 6dbeba55..304b417b 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtStatement2AStatement.java @@ -64,7 +64,7 @@ public class CtStatement2AStatement { private static final BiFunctionClassMap CONVERTER = new BiFunctionClassMap<>(); static { - CONVERTER.put(CtInvocation.class, JExpressionStatement::newInstance); + CONVERTER.put(CtInvocation.class, CtExpression2AExpression::ctInvokation); CONVERTER.put(CtAssignment.class, JExpressionStatement::newInstance); CONVERTER.put(CtIf.class, JIf::newInstance); CONVERTER.put(CtLoop.class, JLoop::newInstance); From 49b7cbdb2cb7ae2634996902d088fd5709650a8e Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Tue, 13 Jan 2026 01:25:45 +0000 Subject: [PATCH 3/5] [KadabraNodes] Integrate Weaver engine into various node creation methods --- Kadabra-JS/src-api/kadabra/KadabraNodes.ts | 50 ++++++++++++++++------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/Kadabra-JS/src-api/kadabra/KadabraNodes.ts b/Kadabra-JS/src-api/kadabra/KadabraNodes.ts index cb61dcfa..0c2fd659 100644 --- a/Kadabra-JS/src-api/kadabra/KadabraNodes.ts +++ b/Kadabra-JS/src-api/kadabra/KadabraNodes.ts @@ -4,6 +4,7 @@ import { } from "@specs-feup/lara/api/LaraJoinPoint.js"; import { Joinpoint, LocalVariable } from "../Joinpoints.js"; import KadabraJavaTypes from "./KadabraJavaTypes.js"; +import Weaver from "@specs-feup/lara/api/weaver/Weaver.js"; export class KadabraNodes { /** @@ -40,6 +41,7 @@ export class KadabraNodes { ) { return wrapJoinPoint( KadabraJavaTypes.KadabraJoinPoints.literal( + Weaver.getWeaverEngine(), unwrapJoinPoint(literal), unwrapJoinPoint(type) ) @@ -56,6 +58,7 @@ export class KadabraNodes { static nullLiteral(referenceJp?: Joinpoint) { return wrapJoinPoint( KadabraJavaTypes.KadabraJoinPoints.nullLiteral( + Weaver.getWeaverEngine(), unwrapJoinPoint(referenceJp) ) ); @@ -85,6 +88,7 @@ export class KadabraNodes { ) { return wrapJoinPoint( KadabraJavaTypes.KadabraJoinPoints.unaryOperator( + Weaver.getWeaverEngine(), unwrapJoinPoint(operator), unwrapJoinPoint(operand) ) @@ -125,11 +129,14 @@ export class KadabraNodes { lhs: Joinpoint, rhs: Joinpoint ) { - return wrapJoinPoint(KadabraJavaTypes.KadabraJoinPoints.binaryOperator( - unwrapJoinPoint(operator), - unwrapJoinPoint(lhs), - unwrapJoinPoint(rhs) - )); + return wrapJoinPoint( + KadabraJavaTypes.KadabraJoinPoints.binaryOperator( + Weaver.getWeaverEngine(), + unwrapJoinPoint(operator), + unwrapJoinPoint(lhs), + unwrapJoinPoint(rhs) + ) + ); } /** @@ -141,7 +148,13 @@ export class KadabraNodes { * @returns An assignment statement. */ static assignment(lhs: Joinpoint, rhs: Joinpoint) { - return wrapJoinPoint(KadabraJavaTypes.KadabraJoinPoints.assignment(unwrapJoinPoint(lhs), unwrapJoinPoint(rhs))); + return wrapJoinPoint( + KadabraJavaTypes.KadabraJoinPoints.assignment( + Weaver.getWeaverEngine(), + unwrapJoinPoint(lhs), + unwrapJoinPoint(rhs) + ) + ); } /** @@ -154,10 +167,13 @@ export class KadabraNodes { * */ static var(localVariable: LocalVariable, isWrite: boolean = false) { - return wrapJoinPoint(KadabraJavaTypes.KadabraJoinPoints.var( - unwrapJoinPoint(localVariable), - unwrapJoinPoint(isWrite) - )); + return wrapJoinPoint( + KadabraJavaTypes.KadabraJoinPoints.var( + Weaver.getWeaverEngine(), + unwrapJoinPoint(localVariable), + unwrapJoinPoint(isWrite) + ) + ); } /** @@ -168,7 +184,12 @@ export class KadabraNodes { * @returns An expression representing the code snippet. */ static snippetExpr(code: string) { - return wrapJoinPoint(KadabraJavaTypes.KadabraJoinPoints.snippetExpression(unwrapJoinPoint(code))); + return wrapJoinPoint( + KadabraJavaTypes.KadabraJoinPoints.snippetExpression( + Weaver.getWeaverEngine(), + unwrapJoinPoint(code) + ) + ); } /** @@ -179,6 +200,11 @@ export class KadabraNodes { * @returns The parsed XML node. */ static xmlNode(xmlCode: string) { - return wrapJoinPoint(KadabraJavaTypes.AndroidResources.parseXml(unwrapJoinPoint(xmlCode))); + return wrapJoinPoint( + KadabraJavaTypes.AndroidResources.parseXml( + unwrapJoinPoint(xmlCode), + Weaver.getWeaverEngine() + ) + ); } } From 6bfc98ae1b1229ebd04d02b8cc966fc9d6bc7e31 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Mon, 19 Jan 2026 00:47:31 +0000 Subject: [PATCH 4/5] Integrate Weaver engine into comment node creation method --- Kadabra-JS/src-api/kadabra/KadabraNodes.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/Kadabra-JS/src-api/kadabra/KadabraNodes.ts b/Kadabra-JS/src-api/kadabra/KadabraNodes.ts index 0c2fd659..3eefe03b 100644 --- a/Kadabra-JS/src-api/kadabra/KadabraNodes.ts +++ b/Kadabra-JS/src-api/kadabra/KadabraNodes.ts @@ -21,6 +21,7 @@ export class KadabraNodes { ) { return wrapJoinPoint( KadabraJavaTypes.KadabraJoinPoints.comment( + Weaver.getWeaverEngine(), unwrapJoinPoint(comment), unwrapJoinPoint(type) ) From 5c67dc23df42be92086cfe903aab5dd40ac849d5 Mon Sep 17 00:00:00 2001 From: "L. Sousa" Date: Thu, 22 Jan 2026 00:56:01 +0000 Subject: [PATCH 5/5] New versions of Spoon break the detected type of CtInvocation in the Converters. An explicit entry is now present to ensure the proper joinpoint is created. --- .../weaver/utils/weaving/converters/CtElement2JoinPoint.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java b/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java index 2d9b1804..bf674466 100644 --- a/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java +++ b/JavaWeaver/src/weaver/utils/weaving/converters/CtElement2JoinPoint.java @@ -22,6 +22,7 @@ import spoon.reflect.code.CtCatch; import spoon.reflect.code.CtComment; import spoon.reflect.code.CtExpression; +import spoon.reflect.code.CtInvocation; import spoon.reflect.code.CtStatement; import spoon.reflect.declaration.CtCompilationUnit; import spoon.reflect.declaration.CtElement; @@ -70,6 +71,7 @@ public class CtElement2JoinPoint { // Elements with own converter CONVERTER.put(CtExecutable.class, CtExecutable2AExecutable::convert); CONVERTER.put(CtType.class, CtType2AType::convert); + CONVERTER.put(CtInvocation.class, CtStatement2AStatement::convert); CONVERTER.put(CtStatement.class, CtStatement2AStatement::convert); CONVERTER.put(CtExpression.class, CtExpression2AExpression::convert); CONVERTER.put(CtTypeReference.class, JTypeReference::newInstance);