blob: de35fb74b2439cf7c2d81d2c37bd055bf714772c [file] [log] [blame]
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);
}
}