Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: bb3bfb757c7b26b57e1e5ed62feb3b1fa0c99e95 (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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
/*******************************************************************************
 * Copyright (c) 2000, 2017 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.compiler.env;

import java.util.Arrays;

import org.eclipse.jdt.internal.compiler.lookup.ModuleBinding;
import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;

public class NameEnvironmentAnswer {

	// only one of the four can be set
	IBinaryType binaryType;
	ICompilationUnit compilationUnit;
	ISourceType[] sourceTypes;
	ReferenceBinding binding;

	AccessRestriction accessRestriction;
	char[] moduleName; // set by name environment
	public ModuleBinding moduleBinding; // updated by LookupEnvironment
	String externalAnnotationPath; // should be an absolute file system path

	public NameEnvironmentAnswer(IBinaryType binaryType, AccessRestriction accessRestriction) {
		this.binaryType = binaryType;
		this.accessRestriction = accessRestriction;
		this.moduleName = binaryType.getModule();
	}

	public NameEnvironmentAnswer(IBinaryType binaryType, AccessRestriction accessRestriction, char[] module) {
		this.binaryType = binaryType;
		this.accessRestriction = accessRestriction;
		this.moduleName = module;
	}
	public NameEnvironmentAnswer(ICompilationUnit compilationUnit, AccessRestriction accessRestriction) {
		this(compilationUnit, accessRestriction, compilationUnit.getModuleName());
	}
	public NameEnvironmentAnswer(ICompilationUnit compilationUnit, AccessRestriction accessRestriction, char[] module) {
		this.compilationUnit = compilationUnit;
		this.accessRestriction = accessRestriction;
		this.moduleName = module;
	}

	public NameEnvironmentAnswer(ISourceType[] sourceTypes, AccessRestriction accessRestriction, String externalAnnotationPath, char[] module) {
		this.sourceTypes = sourceTypes;
		this.accessRestriction = accessRestriction;
		this.externalAnnotationPath = externalAnnotationPath;
		this.moduleName = module;
	}
	
	public NameEnvironmentAnswer(ReferenceBinding binding, ModuleBinding module) {
		this.binding = binding;
		this.moduleBinding = module;
	}

	@Override
	public String toString() {
		String baseString = ""; //$NON-NLS-1$
		if (this.binaryType != null) {
			char[] fileNameChars = this.binaryType.getFileName();
			String fileName = fileNameChars == null ? "" : new String(fileNameChars); //$NON-NLS-1$
			baseString = "IBinaryType " + fileName; //$NON-NLS-1$
		}
		if (this.compilationUnit != null) {
			baseString = "ICompilationUnit " + this.compilationUnit.toString(); //$NON-NLS-1$
		}
		if (this.sourceTypes != null) {
			baseString = Arrays.toString(this.sourceTypes);
		}
		if (this.accessRestriction != null) {
			baseString += " " + this.accessRestriction.toString(); //$NON-NLS-1$
		}
		if (this.externalAnnotationPath != null) {
			baseString += " extPath=" + this.externalAnnotationPath.toString(); //$NON-NLS-1$
		}
		if (this.moduleName != null) {
			baseString += " module=" + String.valueOf(this.moduleName); //$NON-NLS-1$
		}
		return baseString;
	}
	
	/**
	 * Returns the associated access restriction, or null if none.
	 */
	public AccessRestriction getAccessRestriction() {
		return this.accessRestriction;
	}

	public void setBinaryType(IBinaryType newType) {
		this.binaryType = newType;
	}

	/**
	 * Answer the resolved binary form for the type or null if the receiver represents a compilation unit or source
	 * type.
	 */
	public IBinaryType getBinaryType() {
		return this.binaryType;
	}

	/**
	 * Answer the compilation unit or null if the
	 * receiver represents a binary or source type.
	 */
	public ICompilationUnit getCompilationUnit() {
		return this.compilationUnit;
	}

	public String getExternalAnnotationPath() {
		return this.externalAnnotationPath;
	}

	/**
	 * Answer the unresolved source forms for the type or null if the
	 * receiver represents a compilation unit or binary type.
	 *
	 * Multiple source forms can be answered in case the originating compilation unit did contain
	 * several type at once. Then the first type is guaranteed to be the requested type.
	 */
	public ISourceType[] getSourceTypes() {
		return this.sourceTypes;
	}

	/**
	 * Answer the resolved compiler binding that was late found during askForName().
	 */
	public ReferenceBinding getResolvedBinding() {
		return this.binding;
	}

	/**
	 * Answer whether the receiver contains the resolved binary form of the type.
	 */
	public boolean isBinaryType() {
		return this.binaryType != null;
	}

	/**
	 * Answer whether the receiver contains the compilation unit which defines the type.
	 */
	public boolean isCompilationUnit() {
		return this.compilationUnit != null;
	}

	/**
	 * Answer whether the receiver contains the unresolved source form of the type.
	 */
	public boolean isSourceType() {
		return this.sourceTypes != null;
	}

	/**
	 * Answer whether the receiver contains the resolved compiler binding of the type.
	 */
	public boolean isResolvedBinding() {
		return this.binding != null;
	}

	public boolean ignoreIfBetter() {
		return this.accessRestriction != null && this.accessRestriction.ignoreIfBetter();
	}
	
	/** 
	 * Name of the module to which the CU in this answer is associated.
	 * {@code null} when associated to the unnamed module. 
	 * @return module name or {@code null}
	 */
	public char[] moduleName() {
		return this.moduleName;
	}

	/*
	 * Returns whether this answer is better than the other awswer.
	 * (accessible is better than discouraged, which is better than
	 * non-accessible)
	 */
	public boolean isBetter(NameEnvironmentAnswer otherAnswer) {
		if (otherAnswer == null) return true;
		if (this.accessRestriction == null) return true;
		return otherAnswer.accessRestriction != null
			&& this.accessRestriction.getProblemId() < otherAnswer.accessRestriction.getProblemId();
	}
}

Back to the top