X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/QualifiedThisReference.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/QualifiedThisReference.java index e19c352..5dd3156 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/QualifiedThisReference.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ast/QualifiedThisReference.java @@ -1,29 +1,30 @@ /******************************************************************************* - * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others. + * Copyright (c) 2000, 2003 IBM Corporation and others. * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Common Public License v0.5 + * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/cpl-v05.html + * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * IBM Corporation - initial API and implementation - ******************************************************************************/ + *******************************************************************************/ package net.sourceforge.phpdt.internal.compiler.ast; -import net.sourceforge.phpdt.internal.compiler.IAbstractSyntaxTreeVisitor; -import net.sourceforge.phpdt.internal.compiler.codegen.*; -import net.sourceforge.phpdt.internal.compiler.flow.*; -import net.sourceforge.phpdt.internal.compiler.lookup.*; +import net.sourceforge.phpdt.internal.compiler.ASTVisitor; +import net.sourceforge.phpdt.internal.compiler.flow.FlowContext; +import net.sourceforge.phpdt.internal.compiler.flow.FlowInfo; +import net.sourceforge.phpdt.internal.compiler.lookup.BlockScope; +import net.sourceforge.phpdt.internal.compiler.lookup.ReferenceBinding; +import net.sourceforge.phpdt.internal.compiler.lookup.TypeBinding; public class QualifiedThisReference extends ThisReference { public TypeReference qualification; ReferenceBinding currentCompatibleType; - - public QualifiedThisReference(TypeReference name, int pos, int sourceEnd) { - + + public QualifiedThisReference(TypeReference name, int sourceStart, int sourceEnd) { + super(sourceStart, sourceEnd); qualification = name; - this.sourceEnd = sourceEnd; this.sourceStart = name.sourceStart; } @@ -32,7 +33,6 @@ public class QualifiedThisReference extends ThisReference { FlowContext flowContext, FlowInfo flowInfo) { - manageEnclosingInstanceAccessIfNecessary(currentScope); return flowInfo; } @@ -42,121 +42,63 @@ public class QualifiedThisReference extends ThisReference { FlowInfo flowInfo, boolean valueRequired) { - if (valueRequired) { - manageEnclosingInstanceAccessIfNecessary(currentScope); - } return flowInfo; } - protected boolean checkAccess( - MethodScope methodScope, - TypeBinding targetType) { - - // this/super cannot be used in constructor call - if (methodScope.isConstructorCall) { - methodScope.problemReporter().fieldsOrThisBeforeConstructorInvocation(this); - return false; - } - - // static may not refer to this/super - if (methodScope.isStatic) { - methodScope.problemReporter().incorrectEnclosingInstanceReference( - this, - targetType); - return false; - } - return true; - } - /** * Code generation for QualifiedThisReference * - * @param currentScope org.eclipse.jdt.internal.compiler.lookup.BlockScope - * @param codeStream org.eclipse.jdt.internal.compiler.codegen.CodeStream + * @param currentScope net.sourceforge.phpdt.internal.compiler.lookup.BlockScope + * @param codeStream net.sourceforge.phpdt.internal.compiler.codegen.CodeStream * @param valueRequired boolean */ - public void generateCode( - BlockScope currentScope, - CodeStream codeStream, - boolean valueRequired) { - - int pc = codeStream.position; - if (valueRequired) { - if ((bits & DepthMASK) != 0) { - Object[] emulationPath = - currentScope.getExactEmulationPath(currentCompatibleType); - if (emulationPath == null) { - // internal error, per construction we should have found it - currentScope.problemReporter().needImplementation(); - } else { - codeStream.generateOuterAccess(emulationPath, this, currentScope); - } - } else { - // nothing particular after all - codeStream.aload_0(); - } - } - codeStream.recordPositionsFrom(pc, this.sourceStart); - } - - void manageEnclosingInstanceAccessIfNecessary(BlockScope currentScope) { - - currentScope.emulateOuterAccess( - (SourceTypeBinding) currentCompatibleType, - false); - // request cascade of accesses - } +// public void generateCode( +// BlockScope currentScope, +// CodeStream codeStream, +// boolean valueRequired) { +// +// int pc = codeStream.position; +// if (valueRequired) { +// if ((bits & DepthMASK) != 0) { +// Object[] emulationPath = +// currentScope.getEmulationPath(this.currentCompatibleType, true /*only exact match*/, false/*consider enclosing arg*/); +// codeStream.generateOuterAccess(emulationPath, this, this.currentCompatibleType, currentScope); +// } else { +// // nothing particular after all +// codeStream.aload_0(); +// } +// } +// codeStream.recordPositionsFrom(pc, this.sourceStart); +// } public TypeBinding resolveType(BlockScope scope) { constant = NotAConstant; - TypeBinding qualificationTb = qualification.resolveType(scope); - if (qualificationTb == null) - return null; + this.resolvedType = qualification.resolveType(scope); + if (this.resolvedType == null) return null; // the qualification MUST exactly match some enclosing type name // Its possible to qualify 'this' by the name of the current class int depth = 0; - currentCompatibleType = scope.referenceType().binding; - while (currentCompatibleType != null - && currentCompatibleType != qualificationTb) { + this.currentCompatibleType = scope.referenceType().binding; + while (this.currentCompatibleType != null + && this.currentCompatibleType != this.resolvedType) { depth++; - currentCompatibleType = - currentCompatibleType.isStatic() ? null : currentCompatibleType.enclosingType(); + this.currentCompatibleType = this.currentCompatibleType.isStatic() ? null : this.currentCompatibleType.enclosingType(); } bits &= ~DepthMASK; // flush previous depth if any bits |= (depth & 0xFF) << DepthSHIFT; // encoded depth into 8 bits - if (currentCompatibleType == null) { - scope.problemReporter().incorrectEnclosingInstanceReference( - this, - qualificationTb); - return null; + if (this.currentCompatibleType == null) { + scope.problemReporter().noSuchEnclosingInstance(this.resolvedType, this, false); + return this.resolvedType; } // Ensure one cannot write code like: B() { super(B.this); } if (depth == 0) { - if (!checkAccess(scope.methodScope(), qualificationTb)) - return null; - } else { - // Could also be targeting an enclosing instance inside a super constructor invocation - // class X { - // public X(int i) { - // this(new Object() { Object obj = X.this; }); - // } - // } - - MethodScope methodScope = scope.methodScope(); - while (methodScope != null) { - if (methodScope.enclosingSourceType() == currentCompatibleType) { - if (!this.checkAccess(methodScope, qualificationTb)) - return null; - break; - } - methodScope = methodScope.parent.methodScope(); - } - } - return qualificationTb; + checkAccess(scope.methodScope()); + } // if depth>0, path emulation will diagnose bad scenarii + return this.resolvedType; } public String toStringExpression() { @@ -165,7 +107,7 @@ public class QualifiedThisReference extends ThisReference { } public void traverse( - IAbstractSyntaxTreeVisitor visitor, + ASTVisitor visitor, BlockScope blockScope) { if (visitor.visit(this, blockScope)) { @@ -173,4 +115,4 @@ public class QualifiedThisReference extends ThisReference { } visitor.endVisit(this, blockScope); } -} \ No newline at end of file +}