summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormikaelpeltier <mikaelpeltier@google.com>2014-09-16 15:27:54 +0200
committermikaelpeltier <mikaelpeltier@google.com>2014-09-22 09:41:58 +0200
commitda7d63ab98c2f62cafd28f1135e8fadc91ae7c28 (patch)
tree941ae52cec6fc67235fa636abd629922b9160b01
parentbd2d95ccb1f7169aa50820f3112facc88c1b90cd (diff)
downloadtoolchain_jack-da7d63ab98c2f62cafd28f1135e8fadc91ae7c28.zip
toolchain_jack-da7d63ab98c2f62cafd28f1135e8fadc91ae7c28.tar.gz
toolchain_jack-da7d63ab98c2f62cafd28f1135e8fadc91ae7c28.tar.bz2
Add an AST checker
- Currently ast checker, check only parents - Now, parent checking is more precise since it use the checkValidity method that checks also type of parent node. Bug: 14101350 Change-Id: I5ba04a40cb5d14e7272df3e1768126b5b3f58a98
-rw-r--r--jack/src/com/android/jack/Jack.java18
-rw-r--r--jack/src/com/android/jack/ir/InternalCompilerException.java28
-rw-r--r--jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java10
-rw-r--r--jack/src/com/android/jack/ir/ast/JAnnotationMethod.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JArrayType.java5
-rw-r--r--jack/src/com/android/jack/ir/ast/JCaseStatement.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JEnumField.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JExpression.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JField.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JLabel.java9
-rw-r--r--jack/src/com/android/jack/ir/ast/JLiteral.java14
-rw-r--r--jack/src/com/android/jack/ir/ast/JLocal.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JMethod.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JNameValuePair.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JNode.java4
-rw-r--r--jack/src/com/android/jack/ir/ast/JNullType.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JPackage.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JParameter.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JPrimitiveType.java9
-rw-r--r--jack/src/com/android/jack/ir/ast/JSession.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JStatement.java8
-rw-r--r--jack/src/com/android/jack/ir/ast/JThis.java8
-rw-r--r--jack/src/com/android/jack/transformations/parent/AstChecker.java (renamed from jack/src/com/android/jack/transformations/parent/ParentChecker.java)14
-rw-r--r--jack/src/com/android/jack/transformations/parent/TypeAstChecker.java (renamed from jack/src/com/android/jack/transformations/parent/TypeParentChecker.java)8
-rw-r--r--jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java4
-rw-r--r--jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java4
-rw-r--r--jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java4
30 files changed, 234 insertions, 33 deletions
diff --git a/jack/src/com/android/jack/Jack.java b/jack/src/com/android/jack/Jack.java
index be20715..02838ad 100644
--- a/jack/src/com/android/jack/Jack.java
+++ b/jack/src/com/android/jack/Jack.java
@@ -226,8 +226,8 @@ import com.android.jack.transformations.flow.FlowNormalizer;
import com.android.jack.transformations.flow.FlowNormalizerSchedulingSeparator;
import com.android.jack.transformations.parent.DeclaredTypePackageChecker;
import com.android.jack.transformations.parent.PackageChecker;
-import com.android.jack.transformations.parent.ParentChecker;
-import com.android.jack.transformations.parent.TypeParentChecker;
+import com.android.jack.transformations.parent.AstChecker;
+import com.android.jack.transformations.parent.TypeAstChecker;
import com.android.jack.transformations.renamepackage.PackageRenamer;
import com.android.jack.transformations.rop.cast.RopCastLegalizer;
import com.android.jack.transformations.threeaddresscode.ThreeAddressCodeBuilder;
@@ -884,7 +884,7 @@ public abstract class Jack {
}
if (hasSanityChecks) {
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
}
{
@@ -1129,13 +1129,13 @@ public abstract class Jack {
}
}
if (hasSanityChecks) {
- typePlan5.append(TypeParentChecker.class);
+ typePlan5.append(TypeAstChecker.class);
}
typePlan5.append(OneDexPerTypeWriter.class);
}
if (hasSanityChecks) {
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
{
SubPlanBuilder<JDefinedClassOrInterface> typePlan =
planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
@@ -1167,7 +1167,7 @@ public abstract class Jack {
appendMultiDexAndShrobStartPlan(planBuilder);
if (hasSanityChecks) {
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
}
{
SubPlanBuilder<JDefinedClassOrInterface> typePlan7 =
@@ -1396,7 +1396,7 @@ public abstract class Jack {
appendMultiDexAndShrobStartPlan(planBuilder);
if (hasSanityChecks) {
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
}
{
SubPlanBuilder<JDefinedClassOrInterface> typePlan3 =
@@ -1529,13 +1529,13 @@ public abstract class Jack {
}
}
if (hasSanityChecks) {
- typePlan5.append(TypeParentChecker.class);
+ typePlan5.append(TypeAstChecker.class);
}
typePlan5.append(OneDexPerTypeWriter.class);
}
if (hasSanityChecks) {
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
}
}
diff --git a/jack/src/com/android/jack/ir/InternalCompilerException.java b/jack/src/com/android/jack/ir/InternalCompilerException.java
index 8f38077..6e6ccbc 100644
--- a/jack/src/com/android/jack/ir/InternalCompilerException.java
+++ b/jack/src/com/android/jack/ir/InternalCompilerException.java
@@ -20,6 +20,8 @@ import com.android.jack.ir.sourceinfo.SourceInfo;
import java.util.ArrayList;
import java.util.List;
+import javax.annotation.Nonnull;
+
/**
* Indicates the compiler encountered an unexpected and unsupported state of
* operation.
@@ -73,6 +75,7 @@ public class InternalCompilerException extends RuntimeException {
/**
* Tracks if there's a pending addNode() to avoid recursion sickness.
*/
+ @Nonnull
private static final ThreadLocal<InternalCompilerException> pendingICE =
new ThreadLocal<InternalCompilerException>();
@@ -87,34 +90,44 @@ public class InternalCompilerException extends RuntimeException {
pendingICE.set(pendingICE.get());
}
+ @Nonnull
private final List<NodeInfo> nodeTrace = new ArrayList<NodeInfo>();
/**
* Constructs a new exception with the specified node, message, and cause.
*/
- public InternalCompilerException(HasSourceInfo node, String message, Throwable cause) {
+ public InternalCompilerException(@Nonnull HasSourceInfo node, @Nonnull String message,
+ @Nonnull Throwable cause) {
this(message, cause);
addNode(node);
}
/**
+ * Constructs a new exception with the specified node and message.
+ */
+ public InternalCompilerException(@Nonnull HasSourceInfo node, @Nonnull String message) {
+ this(message);
+ addNode(node);
+ }
+
+ /**
* Constructs a new exception with the specified message.
*/
- public InternalCompilerException(String message) {
+ public InternalCompilerException(@Nonnull String message) {
super(message);
}
/**
* Constructs a new exception with the specified cause.
*/
- public InternalCompilerException(Throwable cause) {
+ public InternalCompilerException(@Nonnull Throwable cause) {
super(cause);
}
/**
* Constructs a new exception with the specified message and cause.
*/
- public InternalCompilerException(String message, Throwable cause) {
+ public InternalCompilerException(@Nonnull String message, @Nonnull Throwable cause) {
super(message, cause);
}
@@ -122,7 +135,7 @@ public class InternalCompilerException extends RuntimeException {
* Adds a node to the end of the node trace. This is similar to how a stack
* trace works.
*/
- public void addNode(HasSourceInfo node) {
+ public void addNode(@Nonnull HasSourceInfo node) {
InternalCompilerException other = pendingICE.get();
if (other != null) {
// Avoiding recursion sickness: Yet Another ICE must have occurred while
@@ -150,8 +163,8 @@ public class InternalCompilerException extends RuntimeException {
}
/**
- * Adds information about a a node to the end of the node trace. This is
- * similar to how a stack trace works.
+ * Adds information about a a node to the end of the node trace.
+ * This is similar to how a stack trace works.
*/
public void addNode(String className, String description, SourceInfo sourceInfo) {
nodeTrace.add(new NodeInfo(className, description, sourceInfo));
@@ -164,6 +177,7 @@ public class InternalCompilerException extends RuntimeException {
* list is the node that was most specifically being visited when the
* exception was thrown.
*/
+ @Nonnull
public List<NodeInfo> getNodeTrace() {
return nodeTrace;
}
diff --git a/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java b/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java
index 2239a2e..17287d6 100644
--- a/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java
+++ b/jack/src/com/android/jack/ir/ast/JAbstractMethodBody.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Description;
@@ -39,4 +40,11 @@ public abstract class JAbstractMethodBody extends JNode {
public void setMethod(JMethod method) {
this.method = method;
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JMethod)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java b/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java
index 6b20680..89dabe3 100644
--- a/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java
+++ b/jack/src/com/android/jack/ir/ast/JAnnotationLiteral.java
@@ -17,6 +17,7 @@
package com.android.jack.ir.ast;
import com.android.jack.Jack;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -158,4 +159,13 @@ public class JAnnotationLiteral extends JLiteral {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JDefinedClassOrInterface || parent instanceof JMethod
+ || parent instanceof JField || parent instanceof JVariable
+ || parent instanceof JArrayLiteral || parent instanceof JNameValuePair)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java b/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java
index bad4e87..9a29c88 100644
--- a/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java
+++ b/jack/src/com/android/jack/ir/ast/JAnnotationMethod.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.load.MethodLoader;
import com.android.sched.item.Description;
@@ -93,4 +94,11 @@ public class JAnnotationMethod extends JMethod {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JDefinedAnnotation)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JArrayType.java b/jack/src/com/android/jack/ir/ast/JArrayType.java
index 6413ca6..48d97d1 100644
--- a/jack/src/com/android/jack/ir/ast/JArrayType.java
+++ b/jack/src/com/android/jack/ir/ast/JArrayType.java
@@ -128,4 +128,9 @@ public class JArrayType extends JDefinedReferenceType {
return false;
}
}
+
+ @Override
+ public void checkValidity() {
+ throw new AssertionError();
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JCaseStatement.java b/jack/src/com/android/jack/ir/ast/JCaseStatement.java
index 4b846d0..cb2b40e 100644
--- a/jack/src/com/android/jack/ir/ast/JCaseStatement.java
+++ b/jack/src/com/android/jack/ir/ast/JCaseStatement.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -77,4 +78,11 @@ public class JCaseStatement extends JStatement {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JSwitchStatement || parent instanceof JBlock)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java b/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java
index 803d2b3..a301675 100644
--- a/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java
+++ b/jack/src/com/android/jack/ir/ast/JDefinedClassOrInterface.java
@@ -17,6 +17,7 @@ package com.android.jack.ir.ast;
import com.android.jack.Jack;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.load.ClassOrInterfaceLoader;
import com.android.jack.load.NopClassOrInterfaceLoader;
@@ -597,4 +598,11 @@ public abstract class JDefinedClassOrInterface extends JDefinedReferenceType
return false;
}
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JPackage)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JEnumField.java b/jack/src/com/android/jack/ir/ast/JEnumField.java
index d417485..6cc38b1 100644
--- a/jack/src/com/android/jack/ir/ast/JEnumField.java
+++ b/jack/src/com/android/jack/ir/ast/JEnumField.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Description;
import com.android.sched.transform.TransformRequest;
@@ -54,4 +55,11 @@ public class JEnumField extends JField {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JDefinedEnum)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JExpression.java b/jack/src/com/android/jack/ir/ast/JExpression.java
index 2fc9e9e..1ec8cab 100644
--- a/jack/src/com/android/jack/ir/ast/JExpression.java
+++ b/jack/src/com/android/jack/ir/ast/JExpression.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Description;
@@ -42,4 +43,11 @@ public abstract class JExpression extends JNode implements HasType {
public JExpressionStatement makeStatement() {
return new JExpressionStatement(getSourceInfo(), this);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JExpression || parent instanceof JStatement)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JField.java b/jack/src/com/android/jack/ir/ast/JField.java
index adb3230..22a703c 100644
--- a/jack/src/com/android/jack/ir/ast/JField.java
+++ b/jack/src/com/android/jack/ir/ast/JField.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -264,4 +265,11 @@ public class JField extends JNode implements HasName, HasType, JVisitable, CanBe
super.transform(existingNode, newNode, transformation);
}
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JDefinedClassOrInterface)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JLabel.java b/jack/src/com/android/jack/ir/ast/JLabel.java
index 478406d..2e91bc8 100644
--- a/jack/src/com/android/jack/ir/ast/JLabel.java
+++ b/jack/src/com/android/jack/ir/ast/JLabel.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.StringInterner;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
@@ -60,4 +61,12 @@ public class JLabel extends JNode implements HasName {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JLabeledStatement || parent instanceof JBreakStatement
+ || parent instanceof JContinueStatement)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JLiteral.java b/jack/src/com/android/jack/ir/ast/JLiteral.java
index 139fed2..bc91551 100644
--- a/jack/src/com/android/jack/ir/ast/JLiteral.java
+++ b/jack/src/com/android/jack/ir/ast/JLiteral.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Description;
@@ -27,4 +28,17 @@ public abstract class JLiteral extends JExpression {
public JLiteral(SourceInfo sourceInfo) {
super(sourceInfo);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JExpression || parent instanceof JNameValuePair
+ || parent instanceof JAssertStatement || parent instanceof JCaseStatement
+ || parent instanceof JDoStatement || parent instanceof JForStatement
+ || parent instanceof JIfStatement || parent instanceof JReturnStatement
+ || parent instanceof JSwitchStatement || parent instanceof JAnnotationMethod
+ || parent instanceof JFieldInitializer || parent instanceof JWhileStatement
+ || parent instanceof JSynchronizedBlock)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JLocal.java b/jack/src/com/android/jack/ir/ast/JLocal.java
index 3d862e3..1919776 100644
--- a/jack/src/com/android/jack/ir/ast/JLocal.java
+++ b/jack/src/com/android/jack/ir/ast/JLocal.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -76,4 +77,11 @@ public class JLocal extends JVariable implements HasEnclosingMethod {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JMethodBody || parent instanceof JCatchBlock)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JMethod.java b/jack/src/com/android/jack/ir/ast/JMethod.java
index 1ecfb11..9022bc9 100644
--- a/jack/src/com/android/jack/ir/ast/JMethod.java
+++ b/jack/src/com/android/jack/ir/ast/JMethod.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.load.MethodLoader;
import com.android.jack.util.NamingTools;
@@ -413,4 +414,11 @@ public class JMethod extends JNode implements HasEnclosingType, HasName, HasType
public void removeLoader() {
loader = NopMethodLoader.INSTANCE;
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JDefinedClassOrInterface)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JNameValuePair.java b/jack/src/com/android/jack/ir/ast/JNameValuePair.java
index 7b01753..ad02345 100644
--- a/jack/src/com/android/jack/ir/ast/JNameValuePair.java
+++ b/jack/src/com/android/jack/ir/ast/JNameValuePair.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -109,4 +110,11 @@ public final class JNameValuePair extends JNode {
public void resolveMethodId(@Nonnull JMethodId methodId) {
this.methodId = methodId;
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JAnnotationLiteral)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JNode.java b/jack/src/com/android/jack/ir/ast/JNode.java
index 50005b7..70a0a50 100644
--- a/jack/src/com/android/jack/ir/ast/JNode.java
+++ b/jack/src/com/android/jack/ir/ast/JNode.java
@@ -90,7 +90,7 @@ public abstract class JNode extends LocalMarkerManager
@Nonnull
protected SourceInfo info;
- private JNode parent = null;
+ protected JNode parent = null;
protected JNode(@Nonnull SourceInfo info) {
assert info != null : "SourceInfo must be provided for JNodes";
@@ -292,4 +292,6 @@ public abstract class JNode extends LocalMarkerManager
@Nonnull SubTreeMarkersCollector<T> collector) {
return collector.getSubTreeMarkersOnPreviousSibling(this);
}
+
+ public abstract void checkValidity();
}
diff --git a/jack/src/com/android/jack/ir/ast/JNullType.java b/jack/src/com/android/jack/ir/ast/JNullType.java
index c06c82c..bf1db2e 100644
--- a/jack/src/com/android/jack/ir/ast/JNullType.java
+++ b/jack/src/com/android/jack/ir/ast/JNullType.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -66,4 +67,11 @@ public class JNullType extends JReferenceTypeCommon {
public final boolean isSameType(@Nonnull JType type) {
return this == type;
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JExpression)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JPackage.java b/jack/src/com/android/jack/ir/ast/JPackage.java
index d43db87..1a96447 100644
--- a/jack/src/com/android/jack/ir/ast/JPackage.java
+++ b/jack/src/com/android/jack/ir/ast/JPackage.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.StringInterner;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.load.PackageLoader;
@@ -498,4 +499,11 @@ public class JPackage extends JNode implements HasName, CanBeRenamed, HasEnclosi
}
}
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JPackage || parent instanceof JSession)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JParameter.java b/jack/src/com/android/jack/ir/ast/JParameter.java
index dec9ce6..51caa6d 100644
--- a/jack/src/com/android/jack/ir/ast/JParameter.java
+++ b/jack/src/com/android/jack/ir/ast/JParameter.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -62,4 +63,11 @@ public class JParameter extends JVariable implements HasEnclosingMethod {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JMethod)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java b/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java
index a3ed01d..ad2420c 100644
--- a/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java
+++ b/jack/src/com/android/jack/ir/ast/JPhantomClassOrInterface.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.util.NamingTools;
import com.android.sched.item.Component;
@@ -170,4 +171,11 @@ public class JPhantomClassOrInterface extends JReferenceTypeCommon implements JC
return false;
}
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JPackage)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JPrimitiveType.java b/jack/src/com/android/jack/ir/ast/JPrimitiveType.java
index 8d3a2e2..a2dab3b 100644
--- a/jack/src/com/android/jack/ir/ast/JPrimitiveType.java
+++ b/jack/src/com/android/jack/ir/ast/JPrimitiveType.java
@@ -17,6 +17,7 @@ package com.android.jack.ir.ast;
import com.android.jack.Jack;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.StringInterner;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.ir.types.JFloatingPointType;
@@ -162,6 +163,14 @@ public abstract class JPrimitiveType extends JNode implements JType {
.isSameType(candidate);
}
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JLocal || parent instanceof JParameter || parent instanceof JMethod
+ || parent instanceof JField || parent instanceof JCastOperation)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
+
@Nonnull
public abstract JPrimitiveTypeEnum getPrimitiveTypeEnum();
diff --git a/jack/src/com/android/jack/ir/ast/JSession.java b/jack/src/com/android/jack/ir/ast/JSession.java
index 67efccc..6c82d41 100644
--- a/jack/src/com/android/jack/ir/ast/JSession.java
+++ b/jack/src/com/android/jack/ir/ast/JSession.java
@@ -16,6 +16,7 @@
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.ast.JPrimitiveType.JPrimitiveTypeEnum;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.jack.ir.sourceinfo.SourceInfoFactory;
@@ -158,4 +159,11 @@ public class JSession extends JNode {
}
return primitiveArrays[primitive.ordinal()];
}
+
+ @Override
+ public void checkValidity() {
+ if (parent != null) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JStatement.java b/jack/src/com/android/jack/ir/ast/JStatement.java
index 04b5e76..763b152 100644
--- a/jack/src/com/android/jack/ir/ast/JStatement.java
+++ b/jack/src/com/android/jack/ir/ast/JStatement.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Description;
@@ -71,4 +72,11 @@ public abstract class JStatement extends JNode {
public List<JCatchBlock> getJCatchBlocks() {
return catchBlocks;
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JStatement || parent instanceof JAbstractMethodBody)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
}
diff --git a/jack/src/com/android/jack/ir/ast/JThis.java b/jack/src/com/android/jack/ir/ast/JThis.java
index 6005bc0..21b1091 100644
--- a/jack/src/com/android/jack/ir/ast/JThis.java
+++ b/jack/src/com/android/jack/ir/ast/JThis.java
@@ -15,6 +15,7 @@
*/
package com.android.jack.ir.ast;
+import com.android.jack.ir.InternalCompilerException;
import com.android.jack.ir.sourceinfo.SourceInfo;
import com.android.sched.item.Component;
import com.android.sched.item.Description;
@@ -62,4 +63,11 @@ public class JThis extends JVariable implements HasEnclosingMethod {
throws Exception {
visitor.visit(this, transformRequest);
}
+
+ @Override
+ public void checkValidity() {
+ if (!(parent instanceof JMethod)) {
+ throw new InternalCompilerException(this, "Invalid parent");
+ }
+ }
} \ No newline at end of file
diff --git a/jack/src/com/android/jack/transformations/parent/ParentChecker.java b/jack/src/com/android/jack/transformations/parent/AstChecker.java
index 984bc2d..a74d897 100644
--- a/jack/src/com/android/jack/transformations/parent/ParentChecker.java
+++ b/jack/src/com/android/jack/transformations/parent/AstChecker.java
@@ -29,22 +29,24 @@ import java.util.Stack;
import javax.annotation.Nonnull;
/**
- * Check that parents of {@link JNode}s are correctly set.
+ * Check that AST of {@link JNode}s is correct.
*/
-@Description("Check that parents of JNodes are correctly set.")
+@Description("Check that AST is correct.")
@Support(SanityChecks.class)
-public class ParentChecker implements RunnableSchedulable<JSession> {
+public class AstChecker implements RunnableSchedulable<JSession> {
- private static class ParentCheckerVisitor extends JVisitor {
+ static class AstCheckerVisitor extends JVisitor {
@Nonnull
private final Stack<JNode> nodes = new Stack<JNode>();
- private ParentCheckerVisitor() {
+ AstCheckerVisitor() {
super(false /* needLoading */);
}
@Override
public boolean visit(@Nonnull JNode node) {
+ node.checkValidity();
+
if (node instanceof JSession) {
if (node.getParent() != null) {
throw new AssertionError("Parent of JSession must be null.");
@@ -70,7 +72,7 @@ public class ParentChecker implements RunnableSchedulable<JSession> {
@Override
public void run(@Nonnull JSession session) throws Exception {
- ParentCheckerVisitor checker = new ParentCheckerVisitor();
+ AstCheckerVisitor checker = new AstCheckerVisitor();
checker.accept(session);
}
} \ No newline at end of file
diff --git a/jack/src/com/android/jack/transformations/parent/TypeParentChecker.java b/jack/src/com/android/jack/transformations/parent/TypeAstChecker.java
index 98470d9..f52a669 100644
--- a/jack/src/com/android/jack/transformations/parent/TypeParentChecker.java
+++ b/jack/src/com/android/jack/transformations/parent/TypeAstChecker.java
@@ -30,13 +30,12 @@ import java.util.Stack;
import javax.annotation.Nonnull;
/**
- * Check that parents of {@link JNode}s are correctly set, running on
+ * Check that AST of {@link JNode}s is correct, running on
* {@link JDefinedClassOrInterface}s.
*/
-@Description(
- "Check that parents of JNodes are correctly set, running on JDefinedClassOrInterfaces.")
+@Description("Check that AST of JNodes is correct, running on JDefinedClassOrInterfaces.")
@Support(SanityChecks.class)
-public class TypeParentChecker implements RunnableSchedulable<JDefinedClassOrInterface> {
+public class TypeAstChecker implements RunnableSchedulable<JDefinedClassOrInterface> {
private static class Visitor extends JVisitor {
@Nonnull
@@ -49,6 +48,7 @@ public class TypeParentChecker implements RunnableSchedulable<JDefinedClassOrInt
@Override
public boolean visit(@Nonnull JNode node) {
assert !(node instanceof JSession);
+ node.checkValidity();
if (node instanceof JDefinedClassOrInterface) {
if (node.getParent() == null) {
throw new AssertionError(
diff --git a/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java b/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java
index 3ba6e52..6778d16 100644
--- a/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java
+++ b/jack/tests/com/android/jack/statistics/BlockStatisticsOnCore.java
@@ -24,7 +24,7 @@ import com.android.jack.ir.ast.JMethod;
import com.android.jack.ir.ast.JSession;
import com.android.jack.scheduling.adapter.JDefinedClassOrInterfaceAdapter;
import com.android.jack.scheduling.adapter.JMethodAdapter;
-import com.android.jack.transformations.parent.ParentChecker;
+import com.android.jack.transformations.parent.AstChecker;
import com.android.sched.scheduler.PlanBuilder;
import com.android.sched.scheduler.Request;
import com.android.sched.scheduler.SchedulableManager;
@@ -89,7 +89,7 @@ public class BlockStatisticsOnCore {
sr.addInitialTagOrMarker(JavaSourceIr.class);
PlanBuilder<JSession> planBuilder = sr.getPlanBuilder(JSession.class);
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
SubPlanBuilder<JDefinedClassOrInterface> typePlan = planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class);
methodPlan.append(BlockStatistics.class);
diff --git a/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java b/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java
index edfd77c..7d9a920 100644
--- a/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java
+++ b/jack/tests/com/android/jack/transformations/ast/ImplicitBlockTest.java
@@ -25,7 +25,7 @@ import com.android.jack.ir.ast.JMethod;
import com.android.jack.ir.ast.JSession;
import com.android.jack.scheduling.adapter.JDefinedClassOrInterfaceAdapter;
import com.android.jack.scheduling.adapter.JMethodAdapter;
-import com.android.jack.transformations.parent.ParentChecker;
+import com.android.jack.transformations.parent.AstChecker;
import com.android.jack.util.filter.SignatureMethodFilter;
import com.android.sched.scheduler.PlanBuilder;
import com.android.sched.scheduler.Request;
@@ -120,7 +120,7 @@ public class ImplicitBlockTest {
sr.addInitialTagOrMarker(JavaSourceIr.class);
PlanBuilder<JSession> planBuilder = sr.getPlanBuilder(JSession.class);
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
SubPlanBuilder<JDefinedClassOrInterface> typePlan = planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class);
methodPlan.append(ImplicitBlocks.class);
diff --git a/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java b/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java
index 47bb69f..fbc2e97 100644
--- a/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java
+++ b/jack/tests/com/android/jack/transformations/ast/SynchronizedTest.java
@@ -32,7 +32,7 @@ import com.android.jack.ir.ast.JUnlock;
import com.android.jack.ir.ast.JVariableRef;
import com.android.jack.scheduling.adapter.JDefinedClassOrInterfaceAdapter;
import com.android.jack.scheduling.adapter.JMethodAdapter;
-import com.android.jack.transformations.parent.ParentChecker;
+import com.android.jack.transformations.parent.AstChecker;
import com.android.jack.util.filter.SignatureMethodFilter;
import com.android.sched.scheduler.PlanBuilder;
import com.android.sched.scheduler.Request;
@@ -154,7 +154,7 @@ public class SynchronizedTest {
sr.addInitialTagsOrMarkers(Jack.getJavaSourceInitialTagSet());
PlanBuilder<JSession> planBuilder = sr.getPlanBuilder(JSession.class);
- planBuilder.append(ParentChecker.class);
+ planBuilder.append(AstChecker.class);
SubPlanBuilder<JDefinedClassOrInterface> typePlan =
planBuilder.appendSubPlan(JDefinedClassOrInterfaceAdapter.class);
SubPlanBuilder<JMethod> methodPlan = typePlan.appendSubPlan(JMethodAdapter.class);