You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2017/10/23 11:25:36 UTC
[sling-org-apache-sling-scripting-sightly-compiler-java] 01/02:
SLING-7205 - Generate import statements for data-sly-use Java use objects
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 <ra...@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" <co...@sling.apache.org>.