fixed bug #1037094 (foreach)
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / internal / compiler / ast / NameReference.java
1 /*******************************************************************************
2  * Copyright (c) 2000, 2003 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
7  * 
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  *******************************************************************************/
11 package net.sourceforge.phpeclipse.internal.compiler.ast;
12
13 import net.sourceforge.phpdt.internal.compiler.lookup.Binding;
14 import net.sourceforge.phpdt.internal.compiler.lookup.BindingIds;
15 import net.sourceforge.phpdt.internal.compiler.lookup.FieldBinding;
16 import net.sourceforge.phpdt.internal.compiler.lookup.InvocationSite;
17 import net.sourceforge.phpdt.internal.compiler.lookup.ReferenceBinding;
18 import net.sourceforge.phpdt.internal.compiler.lookup.TypeBinding;
19
20 public abstract class NameReference extends Reference implements InvocationSite, BindingIds {
21
22         public Binding binding, codegenBinding; //may be aTypeBinding-aFieldBinding-aLocalVariableBinding
23         
24         public TypeBinding receiverType;                // raw receiver type
25         public TypeBinding actualReceiverType;  // modified receiver type - actual one according to namelookup
26
27         //the error printing
28         //some name reference are build as name reference but
29         //only used as type reference. When it happens, instead of
30         //creating a new objet (aTypeReference) we just flag a boolean
31         //This concesion is valuable while their are cases when the NameReference
32         //will be a TypeReference (static message sends.....) and there is
33         //no changeClass in java.
34 public NameReference() {
35         super();
36         bits |= TYPE | VARIABLE; // restrictiveFlag
37         
38 }
39 public FieldBinding fieldBinding() {
40         //this method should be sent ONLY after a check against isFieldReference()
41         //check its use doing senders.........
42
43         return (FieldBinding) binding ;
44 }
45 public boolean isSuperAccess() {
46         return false;
47 }
48 public boolean isTypeAccess() {
49         // null is acceptable when we are resolving the first part of a reference
50         return binding == null || binding instanceof ReferenceBinding;
51 }
52 public boolean isTypeReference() {
53         return binding instanceof ReferenceBinding;
54 }
55 public void setActualReceiverType(ReferenceBinding receiverType) {
56         this.actualReceiverType = receiverType;
57 }
58 public void setDepth(int depth) {
59         bits &= ~DepthMASK; // flush previous depth if any                      
60         if (depth > 0) {
61                 bits |= (depth & 0xFF) << DepthSHIFT; // encoded on 8 bits
62         }
63 }
64 public void setFieldIndex(int index){
65         // ignored
66 }
67
68 public abstract String unboundReferenceErrorName();
69 }