This is an automated email from the ASF dual-hosted git repository. radu pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-sightly-compiler-java.git
commit 3decd6ba5a26635cf67dc16762000e3386812e58 Author: Radu Cotescu <r...@apache.org> AuthorDate: Mon Oct 23 12:14:40 2017 +0200 SLING-7205 - Generate import statements for data-sly-use Java use objects * made sure the classes added to the import list are also used in the renderContext.call() method to generate proper usage information in bytecode --- .../sightly/java/compiler/impl/CodeGenVisitor.java | 12 +++++--- .../java/compiler/impl/ExpressionTranslator.java | 32 ++++++++++++++++++---- .../sightly/java/compiler/impl/JavaSource.java | 8 ++++++ .../sightly/java/compiler/impl/TypeInference.java | 12 +++++--- .../java/JavaClassBackendCompilerTest.java | 3 ++ src/test/resources/imports.html | 2 +- src/test/resources/imports.html.java | 6 ++-- 7 files changed, 58 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java index 629f9ac..50a94c3 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java +++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/CodeGenVisitor.java @@ -117,7 +117,8 @@ public class CodeGenVisitor implements CommandVisitor { @Override public void visit(VariableBinding.Start variableBinding) { source.startBlock(); - TypeInfo typeInfo = TypeInference.inferTypes(variableBinding.getExpression(), analyzer, unitBuilder.getImports()); + TypeInfo typeInfo = TypeInference + .inferTypes(variableBinding.getExpression(), analyzer, unitBuilder.getImports(), unitBuilder.getJavaImportsAnalyzer()); Type type = typeInfo.typeOf(variableBinding.getExpression()); String properName = declare(variableBinding.getVariableName(), type); source.beginAssignment(properName, type.getNativeClass()); @@ -125,7 +126,8 @@ public class CodeGenVisitor implements CommandVisitor { variableBinding.getExpression(), source, analyzer, - typeInfo); + typeInfo, + unitBuilder.getImports()); source.endStatement(); } @@ -142,7 +144,8 @@ public class CodeGenVisitor implements CommandVisitor { @Override public void visit(VariableBinding.Global globalAssignment) { - TypeInfo typeInfo = TypeInference.inferTypes(globalAssignment.getExpression(), analyzer, unitBuilder.getImports()); + TypeInfo typeInfo = TypeInference + .inferTypes(globalAssignment.getExpression(), analyzer, unitBuilder.getImports(), unitBuilder.getJavaImportsAnalyzer()); VariableDescriptor descriptor = analyzer.declareGlobal(globalAssignment.getVariableName()); String name = descriptor.getAssignedName(); source.append(name).assign(); @@ -150,7 +153,8 @@ public class CodeGenVisitor implements CommandVisitor { globalAssignment.getExpression(), source, analyzer, - typeInfo); + typeInfo, + unitBuilder.getImports()); source.endStatement(); String listCoercionVar = descriptor.getListCoercion(); if (listCoercionVar != null) { diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java index 6108c8b..d7e6f47 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java +++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/ExpressionTranslator.java @@ -17,7 +17,9 @@ package org.apache.sling.scripting.sightly.java.compiler.impl; import java.util.Map; +import java.util.Set; +import org.apache.sling.scripting.sightly.compiler.RuntimeFunction; import org.apache.sling.scripting.sightly.compiler.expression.ExpressionNode; import org.apache.sling.scripting.sightly.compiler.expression.SideEffectVisitor; import org.apache.sling.scripting.sightly.compiler.expression.nodes.ArrayLiteral; @@ -33,6 +35,7 @@ import org.apache.sling.scripting.sightly.compiler.expression.nodes.StringConsta import org.apache.sling.scripting.sightly.compiler.expression.nodes.TernaryOperator; import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperation; import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperator; +import org.apache.sling.scripting.sightly.java.compiler.JavaEscapeUtils; import org.apache.sling.scripting.sightly.java.compiler.impl.operator.BinaryOpGen; import org.apache.sling.scripting.sightly.java.compiler.impl.operator.Operators; import org.apache.sling.scripting.sightly.java.compiler.impl.operator.UnaryOpGen; @@ -45,18 +48,21 @@ public final class ExpressionTranslator extends SideEffectVisitor { private final JavaSource source; private final VariableAnalyzer analyzer; private final TypeInfo typeInfo; + private final Set<String> imports; - private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo) { + private ExpressionTranslator(JavaSource source, VariableAnalyzer analyzer, TypeInfo typeInfo, Set<String> imports) { this.source = source; this.analyzer = analyzer; this.typeInfo= typeInfo; + this.imports = imports; } public static void buildExpression(ExpressionNode node, JavaSource source, VariableAnalyzer analyzer, - TypeInfo typeInfo) { - ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo); + TypeInfo typeInfo, + Set<String> imports) { + ExpressionTranslator builder = new ExpressionTranslator(source, analyzer, typeInfo, imports); builder.traverse(node); } @@ -136,11 +142,27 @@ public final class ExpressionTranslator extends SideEffectVisitor { @Override public void visit(RuntimeCall runtimeCall) { + String runtimeCallName = runtimeCall.getFunctionName(); source.startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RUNTIME_CALL_METHOD) - .stringLiteral(runtimeCall.getFunctionName()); + .stringLiteral(runtimeCallName); + int index = 0; for (ExpressionNode arg : runtimeCall.getArguments()) { source.separateArgument(); - visit(arg); + if (RuntimeFunction.USE.equals(runtimeCallName) && index == 0) { + if (arg instanceof StringConstant) { + StringConstant constant = (StringConstant) arg; + String className = constant.getText(); + if (imports.contains(className)) { + source.className(className.substring(className.lastIndexOf('.') + 1)); + } else { + visit(arg); + } + } else { + visit(arg); + } + } else { + visit(arg); + } } source.endCall(); } diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java index f5aefd5..680e340 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java +++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/JavaSource.java @@ -244,6 +244,14 @@ public class JavaSource { return startMethodCall(SourceGenConstants.RENDER_CONTEXT_INSTANCE, SourceGenConstants.RENDER_CONTEXT_GET_OBJECT_MODEL).endCall(); } + public JavaSource property(String target, String property) { + return append(target).append(".").append(property); + } + + public JavaSource className(String className) { + return property(className, "class").startCall("getName", true).endCall(); + } + private StringBuilder indent() { for (int i = 0; i < indentLevel; i++) { builder.append(INDENT); diff --git a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java index 6511de3..b9292d1 100644 --- a/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java +++ b/src/main/java/org/apache/sling/scripting/sightly/java/compiler/impl/TypeInference.java @@ -37,6 +37,7 @@ import org.apache.sling.scripting.sightly.compiler.expression.nodes.RuntimeCall; import org.apache.sling.scripting.sightly.compiler.expression.nodes.StringConstant; import org.apache.sling.scripting.sightly.compiler.expression.nodes.TernaryOperator; import org.apache.sling.scripting.sightly.compiler.expression.nodes.UnaryOperation; +import org.apache.sling.scripting.sightly.java.compiler.JavaImportsAnalyzer; import org.apache.sling.scripting.sightly.java.compiler.impl.operator.BinaryOpGen; import org.apache.sling.scripting.sightly.java.compiler.impl.operator.Operators; import org.apache.sling.scripting.sightly.java.compiler.impl.operator.UnaryOpGen; @@ -49,18 +50,21 @@ public final class TypeInference implements NodeVisitor<Type> { private final VariableAnalyzer analyzer; private final Map<ExpressionNode, Type> inferMap = new IdentityHashMap<>(); private final Set<String> imports; + private final JavaImportsAnalyzer importsAnalyzer; private static final Pattern FQCN_PATTERN = Pattern.compile("([[\\p{L}&&[^\\p{Lu}]]_$][\\p{L}\\p{N}_$]*\\.)+[\\p{Lu}_$][\\p{L}\\p{N}_$]*"); - public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer, Set<String> imports) { - TypeInference typeInference = new TypeInference(analyzer, imports); + public static TypeInfo inferTypes(ExpressionNode node, VariableAnalyzer analyzer, Set<String> imports, + JavaImportsAnalyzer importsAnalyzer) { + TypeInference typeInference = new TypeInference(analyzer, imports, importsAnalyzer); typeInference.infer(node); return new TypeInfo(typeInference.inferMap); } - private TypeInference(VariableAnalyzer analyzer, Set<String> imports) { + private TypeInference(VariableAnalyzer analyzer, Set<String> imports, JavaImportsAnalyzer importsAnalyzer) { this.analyzer = analyzer; this.imports = imports; + this.importsAnalyzer = importsAnalyzer; } @@ -138,7 +142,7 @@ public final class TypeInference implements NodeVisitor<Type> { ExpressionNode identifier = runtimeCall.getArguments().get(0); if (identifier instanceof StringConstant) { String objectType = ((StringConstant) identifier).getText(); - if (FQCN_PATTERN.matcher(objectType).matches()) { + if (FQCN_PATTERN.matcher(objectType).matches() && importsAnalyzer != null && importsAnalyzer.allowImport(objectType)) { imports.add(objectType); return Type.dynamic(objectType); } diff --git a/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java b/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java index 924e519..73ce0a8 100644 --- a/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java +++ b/src/test/java/org/apache/sling/scripting/sightly/compiler/java/JavaClassBackendCompilerTest.java @@ -103,6 +103,9 @@ public class JavaClassBackendCompilerTest { String source = backendCompiler.build(classInfo); String expectedJavaOutput = IOUtils.toString(this.getClass().getResourceAsStream("/imports.html.java"), "UTF-8"); assertEquals(expectedJavaOutput, source); + ClassLoader classLoader = JavaClassBackendCompilerTest.class.getClassLoader(); + CharSequenceJavaCompiler<RenderUnit> compiler = new CharSequenceJavaCompiler<>(classLoader, null); + compiler.compile(classInfo.getFullyQualifiedClassName(), source); } private ClassInfo buildClassInfo(final String info) { diff --git a/src/test/resources/imports.html b/src/test/resources/imports.html index 82d1905..639c635 100644 --- a/src/test/resources/imports.html +++ b/src/test/resources/imports.html @@ -16,7 +16,7 @@ ~ specific language governing permissions and limitations ~ under the License. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/--> -<div data-sly-use.slingSettings="org.apache.sling.settings.SlingSettingsService" +<div data-sly-use.record="org.apache.sling.scripting.sightly.Record" data-sly-use.js="script.js" data-sly-use.pojo="Pojo" ></div> diff --git a/src/test/resources/imports.html.java b/src/test/resources/imports.html.java index f80f7db..bdbcaf1 100644 --- a/src/test/resources/imports.html.java +++ b/src/test/resources/imports.html.java @@ -25,7 +25,7 @@ import javax.script.Bindings; import org.apache.sling.scripting.sightly.java.compiler.RenderUnit; import org.apache.sling.scripting.sightly.render.RenderContext; -import org.apache.sling.settings.SlingSettingsService; +import org.apache.sling.scripting.sightly.Record; public final class Test_imports extends RenderUnit { @@ -37,11 +37,11 @@ public final class Test_imports extends RenderUnit { RenderContext renderContext) { // Main Template Body ----------------------------------------------------------------------------- -Object _global_slingsettings = null; +Object _global_record = null; Object _global_js = null; Object _global_pojo = null; out.write("\n"); -_global_slingsettings = renderContext.call("use", "org.apache.sling.settings.SlingSettingsService", obj()); +_global_record = renderContext.call("use", Record.class.getName(), obj()); _global_js = renderContext.call("use", "script.js", obj()); _global_pojo = renderContext.call("use", "Pojo", obj()); out.write("<div></div>\n"); -- To stop receiving notification emails like this one, please contact "commits@sling.apache.org" <commits@sling.apache.org>.