1 /*******************************************************************************
2 * Copyright (c) 2000, 2004 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Common Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/cpl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.compiler.ast;
13 import org.eclipse.jdt.internal.compiler.ASTVisitor;
14 import org.eclipse.jdt.internal.compiler.flow.FlowContext;
15 import org.eclipse.jdt.internal.compiler.flow.FlowInfo;
16 import org.eclipse.jdt.internal.compiler.lookup.*;
18 public abstract class TypeReference extends Expression {
20 public TypeReference() {
24 public FlowInfo analyseCode(BlockScope currentScope, FlowContext flowContext, FlowInfo flowInfo) {
28 // allows us to trap completion & selection nodes
29 public void aboutToResolve(Scope scope) {
30 // default implementation: do nothing
33 * Answer a base type reference (can be an array of base type).
35 public static final TypeReference baseTypeReference(int baseType, int dim) {
40 return new SingleTypeReference(VoidBinding.simpleName, 0);
42 return new SingleTypeReference(BooleanBinding.simpleName, 0);
44 return new SingleTypeReference(CharBinding.simpleName, 0);
46 return new SingleTypeReference(FloatBinding.simpleName, 0);
48 return new SingleTypeReference(DoubleBinding.simpleName, 0);
50 return new SingleTypeReference(ByteBinding.simpleName, 0);
52 return new SingleTypeReference(ShortBinding.simpleName, 0);
54 return new SingleTypeReference(IntBinding.simpleName, 0);
56 return new SingleTypeReference(LongBinding.simpleName, 0);
61 return new ArrayTypeReference(VoidBinding.simpleName, dim, 0);
63 return new ArrayTypeReference(BooleanBinding.simpleName, dim, 0);
65 return new ArrayTypeReference(CharBinding.simpleName, dim, 0);
67 return new ArrayTypeReference(FloatBinding.simpleName, dim, 0);
69 return new ArrayTypeReference(DoubleBinding.simpleName, dim, 0);
71 return new ArrayTypeReference(ByteBinding.simpleName, dim, 0);
73 return new ArrayTypeReference(ShortBinding.simpleName, dim, 0);
75 return new ArrayTypeReference(IntBinding.simpleName, dim, 0);
77 return new ArrayTypeReference(LongBinding.simpleName, dim, 0);
80 public abstract TypeReference copyDims(int dim);
81 public int dimensions() {
84 public abstract TypeBinding getTypeBinding(Scope scope);
88 public abstract char [][] getTypeName() ;
89 public boolean isTypeReference() {
92 public TypeBinding resolveType(BlockScope blockScope) {
93 // handle the error here
94 this.constant = NotAConstant;
95 if (this.resolvedType != null) { // is a shared type reference which was already resolved
96 if (!this.resolvedType.isValidBinding())
97 return null; // already reported error
99 this.resolvedType = getTypeBinding(blockScope);
100 if (!this.resolvedType.isValidBinding()) {
101 reportInvalidType(blockScope);
104 if (isTypeUseDeprecated(this.resolvedType, blockScope)) {
105 reportDeprecatedType(blockScope);
108 return this.resolvedType;
111 public TypeBinding resolveType(ClassScope classScope) {
112 // handle the error here
113 this.constant = NotAConstant;
114 if (this.resolvedType != null) { // is a shared type reference which was already resolved
115 if (!this.resolvedType.isValidBinding())
116 return null; // already reported error
118 this.resolvedType = getTypeBinding(classScope);
119 if (!this.resolvedType.isValidBinding()) {
120 reportInvalidType(classScope);
123 if (isTypeUseDeprecated(this.resolvedType, classScope)) {
124 reportDeprecatedType(classScope);
127 return this.resolvedType;
129 protected void reportInvalidType(Scope scope) {
130 scope.problemReporter().invalidType(this, this.resolvedType);
132 protected void reportDeprecatedType(Scope scope) {
133 scope.problemReporter().deprecatedType(this.resolvedType, this);
135 public abstract void traverse(ASTVisitor visitor, ClassScope classScope);