Skip to content

Commit 2b1b60b

Browse files
committed
Make net.sf.j2s.core compatiable with latest Eclipse (4.4/4.5)
1 parent e5b535e commit 2b1b60b

13 files changed

+176
-87
lines changed

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/AbstractImageBuilder.java

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2008 IBM Corporation and others.
2+
* Copyright (c) 2000, 2013 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -25,6 +25,7 @@
2525
import org.eclipse.jdt.internal.compiler.util.SimpleSet;
2626
import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
2727
import org.eclipse.jdt.internal.core.JavaModelManager;
28+
import org.eclipse.jdt.internal.core.PackageFragment;
2829
import org.eclipse.jdt.internal.core.util.Messages;
2930
import org.eclipse.jdt.internal.core.util.Util;
3031

@@ -56,7 +57,8 @@ public abstract class AbstractImageBuilder implements ICompilerRequestor, ICompi
5657
protected boolean keepStoringProblemMarkers;
5758
protected SimpleSet filesWithAnnotations = null;
5859

59-
public static int MAX_AT_ONCE = 2000; // best compromise between space used and speed
60+
//2000 is best compromise between space used and speed
61+
public static int MAX_AT_ONCE = Integer.getInteger(JavaModelManager.MAX_COMPILED_UNITS_AT_ONCE, 2000).intValue();
6062
public final static String[] JAVA_PROBLEM_MARKER_ATTRIBUTE_NAMES = {
6163
IMarker.MESSAGE,
6264
IMarker.SEVERITY,
@@ -292,7 +294,7 @@ protected void compile(SourceFile[] units) {
292294
}
293295

294296
int unitsLength = units.length;
295-
this.compiledAllAtOnce = unitsLength <= MAX_AT_ONCE;
297+
this.compiledAllAtOnce = MAX_AT_ONCE == 0 || unitsLength <= MAX_AT_ONCE;
296298
if (this.compiledAllAtOnce) {
297299
// do them all now
298300
if (JavaBuilder.DEBUG)
@@ -671,12 +673,14 @@ protected void storeProblemsFor(SourceFile sourceFile, CategorizedProblem[] prob
671673
// but still try to compile as many source files as possible to help the case when the base libraries are in source
672674
if (!this.keepStoringProblemMarkers) return; // only want the one error recorded on this source file
673675

674-
IResource resource = sourceFile.resource;
675676
HashSet managedMarkerTypes = JavaModelManager.getJavaModelManager().compilationParticipants.managedMarkerTypes();
676-
for (int i = 0, l = problems.length; i < l; i++) {
677+
problems: for (int i = 0, l = problems.length; i < l; i++) {
677678
CategorizedProblem problem = problems[i];
678679
int id = problem.getID();
679-
680+
// we may use a different resource for certain problems such as IProblem.MissingNonNullByDefaultAnnotationOnPackage
681+
// but at the start of the next problem we should reset it to the source file's resource
682+
IResource resource = sourceFile.resource;
683+
680684
// handle missing classfile situation
681685
if (id == IProblem.IsClassPathCorrect) {
682686
String missingClassfileName = problem.getArguments()[0];
@@ -706,6 +710,38 @@ protected void storeProblemsFor(SourceFile sourceFile, CategorizedProblem[] prob
706710
boolean managedProblem = false;
707711
if (IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER.equals(markerType)
708712
|| (managedProblem = managedMarkerTypes.contains(markerType))) {
713+
if (id == IProblem.MissingNonNullByDefaultAnnotationOnPackage && !(CharOperation.equals(sourceFile.getMainTypeName(), TypeConstants.PACKAGE_INFO_NAME))) {
714+
// for this kind of problem, marker needs to be created on the package instead of on the source file
715+
// see bug 372012
716+
char[] fileName = sourceFile.getFileName();
717+
int pkgEnd = CharOperation.lastIndexOf('/', fileName);
718+
if (pkgEnd == -1)
719+
pkgEnd = CharOperation.lastIndexOf(File.separatorChar, fileName);
720+
PackageFragment pkg = null;
721+
if (pkgEnd != -1)
722+
pkg = (PackageFragment) Util.getPackageFragment(sourceFile.getFileName(), pkgEnd, -1 /*no jar separator for java files*/);
723+
724+
if (pkg != null) {
725+
try {
726+
IMarker[] existingMarkers = pkg.resource().findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ZERO);
727+
int len = existingMarkers.length;
728+
for (int j=0; j < len; j++) {
729+
if (((Integer)existingMarkers[j].getAttribute(IJavaModelMarker.ID)).intValue() == IProblem.MissingNonNullByDefaultAnnotationOnPackage) {
730+
continue problems; // marker already present
731+
}
732+
}
733+
} catch (CoreException e) {
734+
// marker retrieval failed, cannot do much
735+
if (JavaModelManager.VERBOSE) {
736+
e.printStackTrace();
737+
}
738+
}
739+
IResource tempRes = pkg.resource();
740+
if (tempRes != null) {
741+
resource = tempRes;
742+
}
743+
}
744+
}
709745
IMarker marker = resource.createMarker(markerType);
710746

711747
String[] attributeNames = JAVA_PROBLEM_MARKER_ATTRIBUTE_NAMES;
@@ -729,8 +765,7 @@ protected void storeProblemsFor(SourceFile sourceFile, CategorizedProblem[] prob
729765
allValues[index++] = problem.isError() ? S_ERROR : S_WARNING; // severity
730766
allValues[index++] = new Integer(id); // ID
731767
allValues[index++] = new Integer(problem.getSourceStart()); // start
732-
int end = problem.getSourceEnd();
733-
allValues[index++] = new Integer(end > 0 ? end + 1 : end); // end
768+
allValues[index++] = new Integer(problem.getSourceEnd() + 1); // end
734769
allValues[index++] = new Integer(problem.getSourceLineNumber()); // line
735770
allValues[index++] = Util.getProblemArgumentsForMarker(problem.getArguments()); // arguments
736771
allValues[index++] = new Integer(problem.getCategoryID()); // category ID
@@ -835,7 +870,7 @@ protected void writeClassFileContents(ClassFile classFile, IFile file, String qu
835870
if (JavaBuilder.DEBUG)
836871
System.out.println("Writing changed class file " + file.getName());//$NON-NLS-1$
837872
if (!file.isDerived())
838-
file.setDerived(true);
873+
file.setDerived(true, null);
839874
file.setContents(input, true, false, null);
840875
} else {
841876
// Default implementation just writes out the bytes for the new class file...

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/AdditionalTypeCollection.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2009 IBM Corporation and others.
2+
* Copyright (c) 2000, 2010 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -16,7 +16,7 @@ public class AdditionalTypeCollection extends ReferenceCollection {
1616

1717
protected AdditionalTypeCollection(char[][] definedTypeNames, char[][][] qualifiedReferences, char[][] simpleNameReferences, char[][] rootReferences) {
1818
super(qualifiedReferences, simpleNameReferences, rootReferences);
19-
this.definedTypeNames = definedTypeNames; // do not bother interning member type names (ie. 'A$M')
19+
this.definedTypeNames = definedTypeNames; // do not bother interning member type names (i.e. 'A$M')
2020
}
2121
}
2222

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/BatchImageBuilder.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2008 IBM Corporation and others.
2+
* Copyright (c) 2000, 2009 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -105,7 +105,7 @@ protected void cleanOutputFolders(boolean copyBack) throws CoreException {
105105
member.accept(
106106
new IResourceVisitor() {
107107
public boolean visit(IResource resource) throws CoreException {
108-
resource.setDerived(true);
108+
resource.setDerived(true, null);
109109
return resource.getType() != IResource.FILE;
110110
}
111111
}
@@ -137,7 +137,7 @@ public boolean visit(IResourceProxy proxy) throws CoreException {
137137
if (Util.isExcluded(resource.getFullPath(), inclusionPatterns, exclusionPatterns, false))
138138
return false;
139139
if (!resource.isDerived())
140-
resource.setDerived(true);
140+
resource.setDerived(true, null);
141141
resource.delete(IResource.FORCE, null);
142142
}
143143
return false;

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/ClasspathJar.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2009 IBM Corporation and others.
2+
* Copyright (c) 2000, 2010 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -15,6 +15,7 @@
1515
import org.eclipse.core.runtime.*;
1616

1717
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
18+
import org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException;
1819
import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
1920
import org.eclipse.jdt.internal.compiler.env.NameEnvironmentAnswer;
2021
import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
@@ -151,7 +152,8 @@ public NameEnvironmentAnswer findClass(String binaryFileName, String qualifiedPa
151152
String fileNameWithoutExtension = qualifiedBinaryFileName.substring(0, qualifiedBinaryFileName.length() - SuffixConstants.SUFFIX_CLASS.length);
152153
return new NameEnvironmentAnswer(reader, this.accessRuleSet.getViolatedRestriction(fileNameWithoutExtension.toCharArray()));
153154
}
154-
} catch (Exception e) { // treat as if class file is missing
155+
} catch (IOException e) { // treat as if class file is missing
156+
} catch (ClassFormatException e) { // treat as if class file is missing
155157
}
156158
return null;
157159
}

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/ClasspathLocation.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2006 IBM Corporation and others.
2+
* Copyright (c) 2000, 2012 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -18,8 +18,8 @@
1818

1919
public abstract class ClasspathLocation {
2020

21-
static ClasspathLocation forSourceFolder(IContainer sourceFolder, IContainer outputFolder, char[][] inclusionPatterns, char[][] exclusionPatterns) {
22-
return new ClasspathMultiDirectory(sourceFolder, outputFolder, inclusionPatterns, exclusionPatterns);
21+
static ClasspathLocation forSourceFolder(IContainer sourceFolder, IContainer outputFolder, char[][] inclusionPatterns, char[][] exclusionPatterns, boolean ignoreOptionalProblems) {
22+
return new ClasspathMultiDirectory(sourceFolder, outputFolder, inclusionPatterns, exclusionPatterns, ignoreOptionalProblems);
2323
}
2424

2525
public static ClasspathLocation forBinaryFolder(IContainer binaryFolder, boolean isOutputFolder, AccessRuleSet accessRuleSet) {

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/ClasspathMultiDirectory.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2009 IBM Corporation and others.
2+
* Copyright (c) 2000, 2012 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -15,20 +15,22 @@
1515
import org.eclipse.jdt.core.compiler.CharOperation;
1616
import org.eclipse.jdt.internal.core.util.Util;
1717

18-
class ClasspathMultiDirectory extends ClasspathDirectory {
18+
public class ClasspathMultiDirectory extends ClasspathDirectory {
1919

2020
IContainer sourceFolder;
2121
char[][] inclusionPatterns; // used by builders when walking source folders
2222
char[][] exclusionPatterns; // used by builders when walking source folders
2323
boolean hasIndependentOutputFolder; // if output folder is not equal to any of the source folders
24+
public boolean ignoreOptionalProblems;
2425

25-
ClasspathMultiDirectory(IContainer sourceFolder, IContainer binaryFolder, char[][] inclusionPatterns, char[][] exclusionPatterns) {
26+
ClasspathMultiDirectory(IContainer sourceFolder, IContainer binaryFolder, char[][] inclusionPatterns, char[][] exclusionPatterns, boolean ignoreOptionalProblems) {
2627
super(binaryFolder, true, null);
2728

2829
this.sourceFolder = sourceFolder;
2930
this.inclusionPatterns = inclusionPatterns;
3031
this.exclusionPatterns = exclusionPatterns;
3132
this.hasIndependentOutputFolder = false;
33+
this.ignoreOptionalProblems = ignoreOptionalProblems;
3234

3335
// handle the case when a state rebuilds a source folder
3436
if (this.inclusionPatterns != null && this.inclusionPatterns.length == 0)
@@ -42,7 +44,8 @@ public boolean equals(Object o) {
4244
if (!(o instanceof ClasspathMultiDirectory)) return false;
4345

4446
ClasspathMultiDirectory md = (ClasspathMultiDirectory) o;
45-
return this.sourceFolder.equals(md.sourceFolder) && this.binaryFolder.equals(md.binaryFolder)
47+
return this.ignoreOptionalProblems == md.ignoreOptionalProblems
48+
&& this.sourceFolder.equals(md.sourceFolder) && this.binaryFolder.equals(md.binaryFolder)
4649
&& CharOperation.equals(this.inclusionPatterns, md.inclusionPatterns)
4750
&& CharOperation.equals(this.exclusionPatterns, md.exclusionPatterns);
4851
}

sources/net.sf.j2s.core/src/net/sf/j2s/core/builder/IncrementalImageBuilder.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2000, 2009 IBM Corporation and others.
2+
* Copyright (c) 2000, 2013 IBM Corporation and others.
33
* All rights reserved. This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v1.0
55
* which accompanies this distribution, and is available at
@@ -229,8 +229,16 @@ protected void addDependentsOf(IPath path, boolean isStructuralChange, StringSet
229229
if (isStructuralChange) {
230230
String last = path.lastSegment();
231231
if (last.length() == TypeConstants.PACKAGE_INFO_NAME.length)
232-
if (CharOperation.equals(last.toCharArray(), TypeConstants.PACKAGE_INFO_NAME))
232+
if (CharOperation.equals(last.toCharArray(), TypeConstants.PACKAGE_INFO_NAME)) {
233233
path = path.removeLastSegments(1); // the package-info file has changed so blame the package itself
234+
/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=323785, in the case of default package,
235+
there is no need to blame the package itself as there can be no annotations or documentation
236+
comment tags in the package-info file that can influence the rest of the package. Just bail out
237+
so we don't touch null objects below.
238+
*/
239+
if (path.isEmpty())
240+
return;
241+
}
234242
}
235243

236244
if (isStructuralChange && !this.hasStructuralChanges) {
@@ -551,7 +559,8 @@ protected boolean findSourceFiles(IResourceDelta sourceDelta, ClasspathMultiDire
551559
for (int i = 0, l = this.sourceLocations.length; i < l; i++) {
552560
if (this.sourceLocations[i].sourceFolder.getFolder(removedPackagePath).exists()) {
553561
// only a package fragment was removed, same as removing multiple source files
554-
createFolder(removedPackagePath, md.binaryFolder); // ensure package exists in the output folder
562+
if (md.hasIndependentOutputFolder)
563+
createFolder(removedPackagePath, md.binaryFolder); // ensure package exists in the output folder
555564
IResourceDelta[] removedChildren = sourceDelta.getAffectedChildren();
556565
for (int j = 0, m = removedChildren.length; j < m; j++)
557566
if (!findSourceFiles(removedChildren[j], md, segmentCount))
@@ -788,6 +797,10 @@ protected void resetCollections() {
788797
}
789798

790799
protected void updateProblemsFor(SourceFile sourceFile, CompilationResult result) throws CoreException {
800+
if (CharOperation.equals(sourceFile.getMainTypeName(), TypeConstants.PACKAGE_INFO_NAME)) {
801+
IResource pkgResource = sourceFile.resource.getParent();
802+
pkgResource.deleteMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false, IResource.DEPTH_ZERO);
803+
}
791804
IMarker[] markers = JavaBuilder.getProblemsFor(sourceFile.resource);
792805
CategorizedProblem[] problems = result.getProblems();
793806
if (problems == null && markers.length == 0) return;
@@ -818,7 +831,7 @@ protected void writeClassFileContents(ClassFile classfile, IFile file, String qu
818831
if (JavaBuilder.DEBUG)
819832
System.out.println("Writing changed class file " + file.getName());//$NON-NLS-1$
820833
if (!file.isDerived())
821-
file.setDerived(true);
834+
file.setDerived(true, null);
822835
file.setContents(new ByteArrayInputStream(bytes), true, false, null);
823836
} else if (JavaBuilder.DEBUG) {
824837
System.out.println("Skipped over unchanged class file " + file.getName());//$NON-NLS-1$

0 commit comments

Comments
 (0)