View | Details | Raw Unified | Return to bug 97466
Collapse All | Expand All

(-)model/org/eclipse/jdt/internal/compiler/parser/SourceTypeConverter.java (-26 / +23 lines)
Lines 34-68 Link Here
34
import org.eclipse.jdt.core.compiler.CharOperation;
34
import org.eclipse.jdt.core.compiler.CharOperation;
35
import org.eclipse.jdt.internal.compiler.CompilationResult;
35
import org.eclipse.jdt.internal.compiler.CompilationResult;
36
import org.eclipse.jdt.internal.compiler.ast.*;
36
import org.eclipse.jdt.internal.compiler.ast.*;
37
import org.eclipse.jdt.internal.compiler.ast.ASTNode;
38
import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
39
import org.eclipse.jdt.internal.compiler.ast.Argument;
40
import org.eclipse.jdt.internal.compiler.ast.ArrayQualifiedTypeReference;
41
import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;
42
import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
43
import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
44
import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
45
import org.eclipse.jdt.internal.compiler.ast.ImportReference;
46
import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
47
import org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
48
import org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
49
import org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
50
import org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
51
import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
52
import org.eclipse.jdt.internal.compiler.ast.TypeParameter;
37
import org.eclipse.jdt.internal.compiler.ast.TypeParameter;
53
import org.eclipse.jdt.internal.compiler.ast.TypeReference;
54
import org.eclipse.jdt.internal.compiler.ast.Wildcard;
55
import org.eclipse.jdt.internal.compiler.env.*;
38
import org.eclipse.jdt.internal.compiler.env.*;
56
import org.eclipse.jdt.internal.compiler.env.ISourceImport;
57
import org.eclipse.jdt.internal.compiler.env.ISourceType;
58
39
59
import org.eclipse.jdt.internal.compiler.lookup.CompilerModifiers;
40
import org.eclipse.jdt.internal.compiler.lookup.CompilerModifiers;
60
import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
41
import org.eclipse.jdt.internal.compiler.lookup.TypeConstants;
61
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
42
import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
62
import org.eclipse.jdt.internal.core.*;
43
import org.eclipse.jdt.internal.core.*;
63
import org.eclipse.jdt.internal.core.JavaElement;
64
import org.eclipse.jdt.internal.core.SourceFieldElementInfo;
65
import org.eclipse.jdt.internal.core.SourceTypeElementInfo;
66
44
67
public class SourceTypeConverter implements CompilerModifiers {
45
public class SourceTypeConverter implements CompilerModifiers {
68
	
46
	
Lines 158-169 Link Here
158
		}
136
		}
159
		/* convert type(s) */
137
		/* convert type(s) */
160
		int typeCount = sourceTypes.length;
138
		int typeCount = sourceTypes.length;
161
		this.unit.types = new TypeDeclaration[typeCount];
139
		final TypeDeclaration[] types = new TypeDeclaration[typeCount];
140
		/*
141
		 * We used a temporary types collection to prevent this.unit.types from being null during a call to
142
		 * convert(...) when the source is syntactically incorrect and the parser is flushing the unit's types.
143
		 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=97466
144
		 */
162
		for (int i = 0; i < typeCount; i++) {
145
		for (int i = 0; i < typeCount; i++) {
163
			SourceTypeElementInfo typeInfo = (SourceTypeElementInfo) sourceTypes[i];
146
			SourceTypeElementInfo typeInfo = (SourceTypeElementInfo) sourceTypes[i];
164
			this.unit.types[i] =
147
			types[i] = convert((SourceType) typeInfo.getHandle(), compilationResult);
165
				convert((SourceType) typeInfo.getHandle(), compilationResult);
166
		}
148
		}
149
		this.unit.types = types;
167
		return this.unit;
150
		return this.unit;
168
	}
151
	}
169
	
152
	
Lines 555-567 Link Here
555
		if (positions == null) return null;
538
		if (positions == null) return null;
556
		int length = positions.length;
539
		int length = positions.length;
557
		Annotation[] annotations = new Annotation[length];
540
		Annotation[] annotations = new Annotation[length];
541
		int recordedAnnotations = 0;
558
		for (int i = 0; i < length; i++) {
542
		for (int i = 0; i < length; i++) {
559
			long position = positions[i];
543
			long position = positions[i];
560
			int start = (int) (position >>> 32);
544
			int start = (int) (position >>> 32);
561
			int end = (int) position;
545
			int end = (int) position;
562
			char[] annotationSource = CharOperation.subarray(cuSource, start, end+1);
546
			char[] annotationSource = CharOperation.subarray(cuSource, start, end+1);
563
			Expression expression = parseMemberValue(annotationSource);
547
			Expression expression = parseMemberValue(annotationSource);
564
			annotations[i] = (Annotation) expression;
548
			/*
549
			 * expression can be null or not an annotation if the source has changed between
550
			 * the moment where the annotation source positions have been retrieved and the moment were
551
			 * this parsing occured.
552
			 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=90916
553
			 */
554
			if (expression instanceof Annotation) {
555
				annotations[i] = (Annotation) expression;
556
				recordedAnnotations++;
557
			}
558
		}
559
		if (length != recordedAnnotations) {
560
			// resize to remove null annotations
561
			System.arraycopy(annotations, 0, (annotations = new Annotation[recordedAnnotations]), 0, recordedAnnotations);
565
		}
562
		}
566
		return annotations;
563
		return annotations;
567
	}
564
	}

Return to bug 97466