| package org.eclipse.jdt.internal.compiler.ast; |
| |
| /* |
| * (c) Copyright IBM Corp. 2000, 2001. |
| * All Rights Reserved. |
| */ |
| import org.eclipse.jdt.internal.compiler.IAbstractSyntaxTreeVisitor; |
| import org.eclipse.jdt.internal.compiler.lookup.*; |
| import org.eclipse.jdt.internal.compiler.parser.*; |
| import org.eclipse.jdt.internal.compiler.problem.*; |
| import org.eclipse.jdt.internal.compiler.util.*; |
| |
| public class MethodDeclaration extends AbstractMethodDeclaration { |
| public TypeReference returnType; |
| /** |
| * MethodDeclaration constructor comment. |
| */ |
| public MethodDeclaration() { |
| super(); |
| } |
| public void checkName() { |
| // look if the name of the method is correct |
| if (isTypeUseDeprecated(binding.returnType, scope)) |
| scope.problemReporter().deprecatedType(binding.returnType, returnType); |
| |
| if (CharOperation.equals(scope.enclosingSourceType().sourceName, selector)) |
| scope.problemReporter().methodWithConstructorName(this); |
| |
| // by grammatical construction, interface methods are always abstract |
| if (scope.enclosingSourceType().isInterface()) |
| return; |
| |
| // if a method has an semicolon body and is not declared as abstract==>error |
| // native methods may have a semicolon body |
| if ((modifiers & AccSemicolonBody) != 0) { |
| if ((modifiers & AccNative) == 0) |
| if ((modifiers & AccAbstract) == 0) |
| scope.problemReporter().methodNeedingAbstractModifier(this); |
| } else { |
| // the method HAS a body --> abstract native modifiers are forbiden |
| if (((modifiers & AccNative) != 0) || ((modifiers & AccAbstract) != 0)) |
| scope.problemReporter().methodNeedingNoBody(this); |
| } |
| } |
| public void parseStatements(Parser parser, CompilationUnitDeclaration unit){ |
| //fill up the method body with statement |
| |
| if (ignoreFurtherInvestigation) return; |
| parser.parse(this, unit); |
| |
| } |
| public void resolve(ClassScope upperScope) { |
| if (binding == null) { |
| ignoreFurtherInvestigation = true; |
| return; |
| } |
| // ========= abort on fatal error ============= |
| try { |
| if (this.returnType != null){ |
| this.returnType.binding = this.binding.returnType; // record the return type binding |
| } |
| } catch (AbortMethod e) { |
| this.ignoreFurtherInvestigation = true; |
| } |
| super.resolve(upperScope); |
| |
| } |
| public String returnTypeToString(int tab) { |
| /*slow code */ |
| |
| if (returnType == null) |
| return ""/*nonNLS*/; |
| return returnType.toString(tab)+" "/*nonNLS*/; |
| } |
| public void traverse(IAbstractSyntaxTreeVisitor visitor, ClassScope classScope) { |
| if (visitor.visit(this, classScope)) { |
| if (returnType != null) |
| returnType.traverse(visitor, scope); |
| if (arguments != null) { |
| int argumentLength = arguments.length; |
| for (int i = 0; i < argumentLength; i++) |
| arguments[i].traverse(visitor, scope); |
| } |
| if (thrownExceptions != null) { |
| int thrownExceptionsLength = thrownExceptions.length; |
| for (int i = 0; i < thrownExceptionsLength; i++) |
| thrownExceptions[i].traverse(visitor, scope); |
| } |
| if (statements != null) { |
| int statementsLength = statements.length; |
| for (int i = 0; i < statementsLength; i++) |
| statements[i].traverse(visitor, scope); |
| } |
| } |
| visitor.endVisit(this, classScope); |
| } |
| } |