Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(283)

Unified Diff: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java

Issue 10516006: Issue 3268. Support for replacing 'assert' statement with 'assert' function (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Changes for review comments Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
diff --git a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
index a0715e22e4fb1474ee028fffd0fd4d3386bc96f8..35ca8fe2bd28c50473c4b465f244fb3b5b77a196 100644
--- a/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
+++ b/compiler/java/com/google/dart/compiler/type/TypeAnalyzer.java
@@ -23,7 +23,6 @@ import com.google.dart.compiler.SystemLibraryManager;
import com.google.dart.compiler.ast.ASTVisitor;
import com.google.dart.compiler.ast.DartArrayAccess;
import com.google.dart.compiler.ast.DartArrayLiteral;
-import com.google.dart.compiler.ast.DartAssertion;
import com.google.dart.compiler.ast.DartBinaryExpression;
import com.google.dart.compiler.ast.DartBlock;
import com.google.dart.compiler.ast.DartBooleanLiteral;
@@ -73,6 +72,7 @@ import com.google.dart.compiler.ast.DartParenthesizedExpression;
import com.google.dart.compiler.ast.DartPropertyAccess;
import com.google.dart.compiler.ast.DartRedirectConstructorInvocation;
import com.google.dart.compiler.ast.DartResourceDirective;
+import com.google.dart.compiler.ast.DartReturnBlock;
import com.google.dart.compiler.ast.DartReturnStatement;
import com.google.dart.compiler.ast.DartSourceDirective;
import com.google.dart.compiler.ast.DartStatement;
@@ -111,6 +111,7 @@ import com.google.dart.compiler.resolver.Elements;
import com.google.dart.compiler.resolver.FieldElement;
import com.google.dart.compiler.resolver.LibraryElement;
import com.google.dart.compiler.resolver.MethodElement;
+import com.google.dart.compiler.resolver.NodeElement;
import com.google.dart.compiler.resolver.ResolverErrorCode;
import com.google.dart.compiler.resolver.TypeErrorCode;
import com.google.dart.compiler.resolver.VariableElement;
@@ -1016,26 +1017,26 @@ public class TypeAnalyzer implements DartCompilationPhase {
return analyzeBinaryOperator(node, target, Token.INDEX, node, node.getKey());
}
- @Override
- public Type visitAssertion(DartAssertion node) {
- DartExpression conditionNode = node.getExpression();
+ /**
+ * Asserts that given {@link DartExpression} is valid for using in "assert" statement.
+ */
+ private void checkAssertCondition(DartExpression conditionNode) {
Type condition = nonVoidTypeOf(conditionNode);
switch (condition.getKind()) {
case FUNCTION:
FunctionType ftype = (FunctionType) condition;
Type returnType = ftype.getReturnType();
if (!types.isAssignable(boolType, returnType) || !ftype.getParameterTypes().isEmpty()) {
- typeError(node, TypeErrorCode.ASSERT_BOOL);
+ typeError(conditionNode, TypeErrorCode.ASSERT_BOOL);
}
break;
default:
if (!types.isAssignable(boolType, condition)) {
- typeError(node, TypeErrorCode.ASSERT_BOOL);
+ typeError(conditionNode, TypeErrorCode.ASSERT_BOOL);
}
break;
}
- return voidType;
}
@Override
@@ -1043,6 +1044,22 @@ public class TypeAnalyzer implements DartCompilationPhase {
return typeAsVoid(node);
}
+ @Override
+ public Type visitReturnBlock(DartReturnBlock node) {
+ // 'assert' is statement
+ if (node.getStatements().size() == 1
+ && node.getStatements().get(0) instanceof DartReturnStatement) {
+ DartReturnStatement statement = (DartReturnStatement) node.getStatements().get(0);
+ DartExpression value = statement.getValue();
+ if (value != null && Elements.isArtificialAssertMethod(value.getElement())) {
+ typeError(value, TypeErrorCode.ASSERT_IS_STATEMENT);
+ return voidType;
+ }
+ }
+ // continue
+ return super.visitReturnBlock(node);
+ }
+
private Type typeAsVoid(DartNode node) {
node.visitChildren(this);
return voidType;
@@ -1236,6 +1253,17 @@ public class TypeAnalyzer implements DartCompilationPhase {
@Override
public Type visitExprStmt(DartExprStmt node) {
+ // special support for incomplete "assert"
+ if (node.getExpression() instanceof DartIdentifier) {
+ DartIdentifier identifier = (DartIdentifier) node.getExpression();
+ NodeElement element = identifier.getElement();
+ if (Objects.equal(identifier.getName(), "assert")
+ && Elements.isArtificialAssertMethod(element)) {
+ onError(node, TypeErrorCode.ASSERT_NUMBER_ARGUMENTS);
+ return voidType;
+ }
+ }
+ // normal
typeOf(node.getExpression());
return voidType;
}
@@ -1950,6 +1978,17 @@ public class TypeAnalyzer implements DartCompilationPhase {
String name = target.getName();
Element element = target.getElement();
node.setElement(element);
+ // special support for "assert"
+ if (Elements.isArtificialAssertMethod(element)) {
+ if (node.getArguments().size() == 1) {
+ DartExpression condition = node.getArguments().get(0);
+ checkAssertCondition(condition);
+ } else {
+ onError(node, TypeErrorCode.ASSERT_NUMBER_ARGUMENTS);
+ }
+ return voidType;
+ }
+ // normal invocation
Type type;
switch (ElementKind.of(element)) {
case FIELD:

Powered by Google App Engine
This is Rietveld 408576698