001: /*
002: * Copyright 2006 Sun Microsystems, Inc. All Rights Reserved.
003: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
004: *
005: * This code is free software; you can redistribute it and/or modify it
006: * under the terms of the GNU General Public License version 2 only, as
007: * published by the Free Software Foundation. Sun designates this
008: * particular file as subject to the "Classpath" exception as provided
009: * by Sun in the LICENSE file that accompanied this code.
010: *
011: * This code is distributed in the hope that it will be useful, but WITHOUT
012: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
013: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
014: * version 2 for more details (a copy is included in the LICENSE file that
015: * accompanied this code).
016: *
017: * You should have received a copy of the GNU General Public License version
018: * 2 along with this work; if not, write to the Free Software Foundation,
019: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
020: *
021: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
022: * CA 95054 USA or visit www.sun.com if you need additional information or
023: * have any questions.
024: */
025:
026: package com.sun.tools.javac.api;
027:
028: import java.io.IOException;
029: import java.lang.ref.SoftReference;
030: import java.util.Iterator;
031:
032: import javax.lang.model.element.Element;
033: import javax.lang.model.element.ExecutableElement;
034: import javax.lang.model.element.TypeElement;
035: import javax.tools.JavaFileObject;
036:
037: import com.sun.source.tree.Tree;
038: import com.sun.source.util.SourcePositions;
039: import com.sun.source.util.TreePath;
040: import com.sun.source.util.Trees;
041: import com.sun.tools.javac.code.Scope;
042: import com.sun.tools.javac.code.Symbol.ClassSymbol;
043: import com.sun.tools.javac.comp.Attr;
044: import com.sun.tools.javac.comp.AttrContext;
045: import com.sun.tools.javac.comp.Enter;
046: import com.sun.tools.javac.comp.Env;
047: import com.sun.tools.javac.comp.MemberEnter;
048: import com.sun.tools.javac.comp.Resolve;
049: import com.sun.tools.javac.tree.JCTree.JCClassDecl;
050: import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
051: import com.sun.tools.javac.tree.JCTree.JCExpression;
052: import com.sun.tools.javac.tree.JCTree.JCMethodDecl;
053: import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
054: import com.sun.tools.javac.tree.JCTree;
055: import com.sun.tools.javac.tree.TreeCopier;
056: import com.sun.tools.javac.tree.TreeInfo;
057: import com.sun.tools.javac.tree.TreeMaker;
058: import com.sun.tools.javac.util.Context;
059: import com.sun.tools.javac.util.List;
060: import com.sun.tools.javac.util.Log;
061:
062: import static com.sun.source.tree.Tree.Kind.*;
063:
064: /**
065: * Provides an implementation of Scope.
066: *
067: * <p><b>This is NOT part of any API supported by Sun Microsystems.
068: * If you write code that depends on this, you do so at your own
069: * risk. This code and its internal interfaces are subject to change
070: * or deletion without notice.</b></p>
071: *
072: * @author Jonathan Gibbons;
073: */
074: public class JavacScope implements com.sun.source.tree.Scope {
075: protected final Env<AttrContext> env;
076:
077: /** Creates a new instance of JavacScope */
078: JavacScope(Env<AttrContext> env) {
079: env.getClass(); // null-check
080: this .env = env;
081: }
082:
083: public JavacScope getEnclosingScope() {
084: if (env.outer != null && env.outer != env)
085: return new JavacScope(env.outer);
086: else {
087: // synthesize an outermost "star-import" scope
088: return new JavacScope(env) {
089: public boolean isStarImportScope() {
090: return true;
091: }
092:
093: public JavacScope getEnclosingScope() {
094: return null;
095: }
096:
097: public Iterable<? extends Element> getLocalElements() {
098: return env.toplevel.starImportScope.getElements();
099: }
100: };
101: }
102: }
103:
104: public TypeElement getEnclosingClass() {
105: // hide the dummy class that javac uses to enclose the top level declarations
106: return (env.outer == null || env.outer == env ? null
107: : env.enclClass.sym);
108: }
109:
110: public ExecutableElement getEnclosingMethod() {
111: return (env.enclMethod == null ? null : env.enclMethod.sym);
112: }
113:
114: public Iterable<? extends Element> getLocalElements() {
115: return env.info.getLocalElements();
116: }
117:
118: public Env<AttrContext> getEnv() {
119: return env;
120: }
121:
122: public boolean isStarImportScope() {
123: return false;
124: }
125:
126: public boolean equals(Object other) {
127: if (other instanceof JavacScope) {
128: JavacScope s = (JavacScope) other;
129: return (env.equals(s.env) && isStarImportScope() == s
130: .isStarImportScope());
131: } else
132: return false;
133: }
134:
135: public int hashCode() {
136: return env.hashCode() + (isStarImportScope() ? 1 : 0);
137: }
138:
139: public String toString() {
140: return "JavacScope[env=" + env + ",starImport="
141: + isStarImportScope() + "]";
142: }
143: }
|