1 16 package com.google.gwt.dev.jdt; 17 18 import org.eclipse.jdt.core.compiler.CharOperation; 19 import org.eclipse.jdt.core.compiler.IProblem; 20 import org.eclipse.jdt.internal.compiler.ASTVisitor; 21 import org.eclipse.jdt.internal.compiler.CompilationResult; 22 import org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess; 23 import org.eclipse.jdt.internal.compiler.ast.Expression; 24 import org.eclipse.jdt.internal.compiler.ast.MessageSend; 25 import org.eclipse.jdt.internal.compiler.lookup.BlockScope; 26 import org.eclipse.jdt.internal.compiler.lookup.Scope; 27 import org.eclipse.jdt.internal.compiler.problem.DefaultProblem; 28 import org.eclipse.jdt.internal.compiler.problem.ProblemHandler; 29 import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; 30 import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities; 31 32 import java.util.Map ; 33 34 40 public class FindDeferredBindingSitesVisitor extends ASTVisitor { 41 42 46 public static class DeferredBindingSite { 47 public final MessageSend messageSend; 48 49 public final Scope scope; 50 51 public DeferredBindingSite(MessageSend messageSend, Scope scope) { 52 this.messageSend = messageSend; 53 this.scope = scope; 54 } 55 } 56 57 public static final String REBIND_MAGIC_CLASS = "com.google.gwt.core.client.GWT"; 58 public static final String REBIND_MAGIC_METHOD = "create"; 59 60 public static void reportRebindProblem(DeferredBindingSite site, 61 String message) { 62 MessageSend messageSend = site.messageSend; 63 Scope scope = site.scope; 64 CompilationResult compResult = scope.compilationUnitScope().referenceContext().compilationResult(); 65 int startLine = ProblemHandler.searchLineNumber( 66 compResult.lineSeparatorPositions, messageSend.sourceStart()); 67 DefaultProblem problem = new DefaultProblem(compResult.fileName, message, 68 IProblem.Unclassified, null, ProblemSeverities.Error, 69 messageSend.sourceStart, messageSend.sourceEnd, startLine); 70 compResult.record(problem, scope.referenceContext()); 71 } 72 73 private final Map results; 74 75 public FindDeferredBindingSitesVisitor(Map requestedTypes) { 76 this.results = requestedTypes; 77 } 78 79 public void endVisit(MessageSend messageSend, BlockScope scope) { 80 final ProblemReporter problemReporter = scope.problemReporter(); 81 82 if (messageSend.binding == null) { 83 return; 86 } 87 88 String methodName = String.valueOf(messageSend.selector); 89 if (!methodName.equals(REBIND_MAGIC_METHOD)) { 90 return; 93 } 94 95 char[][] targetClass = messageSend.binding.declaringClass.compoundName; 96 String targetClassName = CharOperation.toString(targetClass); 97 if (!targetClassName.equals(REBIND_MAGIC_CLASS)) { 98 return; 100 } 101 102 DeferredBindingSite site = new DeferredBindingSite(messageSend, scope); 103 104 Expression[] args = messageSend.arguments; 105 if (args.length != 1) { 106 reportRebindProblem(site, "GWT.create() should take exactly one argument"); 107 return; 108 } 109 110 Expression arg = args[0]; 111 if (!(arg instanceof ClassLiteralAccess)) { 112 reportRebindProblem(site, "Only class literals may be used as arguments to GWT.create()"); 113 return; 114 } 115 116 ClassLiteralAccess cla = (ClassLiteralAccess) arg; 117 String typeName = String.valueOf(cla.targetType.readableName()); 118 if (!results.containsKey(typeName)) { 119 results.put(typeName, site); 120 } 121 } 122 } 123 | Popular Tags |