Skip to main content
summaryrefslogtreecommitdiffstats
blob: 4fa13ebda72d7f82c5251c3b63fd6a475f670667 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
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.impl.*;
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);
}
}

Back to the top