Skip to content

Commit 2e80f29

Browse files
authored
Merge pull request #8752 from lahodaj/proper-inheritance
Private members are never inherited, and package-private members are only sometimes inherited, the Java import analysis needs to account for that.
2 parents 411d55e + f6aa4d7 commit 2e80f29

File tree

3 files changed

+375
-13
lines changed

3 files changed

+375
-13
lines changed

java/java.source.base/src/org/netbeans/modules/java/source/pretty/ImportAnalysis2.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public void classEntered(ClassTree clazz, boolean isAnonymous) {
187187

188188
public void enterVisibleThroughClasses(ClassTree clazz) {
189189
Set<Element> visible = visibleThroughClasses.getFirst();
190-
visible.addAll(overlay.getAllVisibleThrough(model, elements, currentFQN.getFQN(), clazz, modle));
190+
visible.addAll(overlay.getAllVisibleThrough(model, elements, currentFQN.getFQN(), clazz, pack, modle));
191191
}
192192

193193
public void classLeft() {
@@ -367,7 +367,7 @@ public ExpressionTree resolveImport(MemberSelectTree orig, final Element element
367367
return make.Identifier(element.getSimpleName());
368368
}
369369

370-
if (getPackageOf(element) != null && getPackageOf(element).isUnnamed()) {
370+
if (overlay.packageOf(element) != null && overlay.packageOf(element).isUnnamed()) {
371371
if (orig.getExpression().getKind() == Kind.MEMBER_SELECT) {
372372
return make.MemberSelect(resolveImport((MemberSelectTree) orig.getExpression(), element.getEnclosingElement()),
373373
element.getSimpleName());
@@ -452,12 +452,6 @@ private boolean checkPackagesForStarImport(String pkgName, CodeStyle cs) {
452452
return false;
453453
}
454454

455-
private PackageElement getPackageOf(Element el) {
456-
while ((el != null) && (el.getKind() != ElementKind.PACKAGE)) el = el.getEnclosingElement();
457-
458-
return (PackageElement) el;
459-
}
460-
461455
private Map<String, Element> getUsedImplicitlyImportedClasses() {
462456
if (usedImplicitlyImportedClassesCache != null) {
463457
return usedImplicitlyImportedClassesCache;

java/java.source.base/src/org/netbeans/modules/java/source/save/ElementOverlay.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ public int totalMapsSize() {
389389
this.packages.size();
390390
}
391391

392-
public Collection<? extends Element> getAllVisibleThrough(ASTService ast, Elements elements, String what, ClassTree tree, ModuleElement modle) {
392+
public Collection<? extends Element> getAllVisibleThrough(ASTService ast, Elements elements, String what, ClassTree tree, Element currentPackage, ModuleElement modle) {
393393
Collection<Element> result = new ArrayList<Element>();
394394
Element current = what != null ? resolve(ast, elements, what, modle) : null;
395395

@@ -408,30 +408,50 @@ public Collection<? extends Element> getAllVisibleThrough(ASTService ast, Elemen
408408
}
409409
}
410410
} else {
411-
result.addAll(getAllMembers(ast, elements, current));
411+
result.addAll(getAllMembers(ast, elements, current, currentPackage, false));
412412
}
413413

414414
return result;
415415
}
416416

417-
private Collection<? extends Element> getAllMembers(ASTService ast, Elements elements, Element el) {
417+
private Collection<? extends Element> getAllMembers(ASTService ast, Elements elements, Element el, Element currentPackage, boolean inherited) {
418418
List<Element> result = new ArrayList<Element>();
419419

420-
result.addAll(el.getEnclosedElements());
420+
el.getEnclosedElements()
421+
.stream()
422+
.filter(encl -> !inherited || //include all members from the current class
423+
encl.getModifiers().contains(Modifier.PUBLIC) || //public members are inherited
424+
encl.getModifiers().contains(Modifier.PROTECTED) || //protected memebers are inherited
425+
(!encl.getModifiers().contains(Modifier.PRIVATE) && //private member are never inherited
426+
resolvedPackageOf(ast, elements, encl) == currentPackage)) //package-private members are inherited only inside the same package
427+
.forEach(result::add);
421428

422429
for (Element parent : getAllSuperElements(ast, elements, el)) {
423430
if (!el.equals(parent)) {
424-
result.addAll(getAllMembers(ast, elements, parent));
431+
result.addAll(getAllMembers(ast, elements, parent, currentPackage, true));
425432
}
426433
}
427434

428435
return result;
429436
}
430437

438+
private Element resolvedPackageOf(ASTService ast, Elements elements, Element el) {
439+
ModuleElement modle = moduleOf(elements, el);
440+
PackageElement pack = packageOf(el);
441+
442+
return resolve(ast, elements, pack.getQualifiedName().toString(), modle);
443+
}
444+
431445
public PackageElement unnamedPackage(ASTService ast, Elements elements, ModuleElement modle) {
432446
return (PackageElement) resolve(ast, elements, "", modle);
433447
}
434448

449+
public PackageElement packageOf(Element el) {
450+
while ((el != null) && (el.getKind() != ElementKind.PACKAGE)) el = el.getEnclosingElement();
451+
452+
return (PackageElement) el;
453+
}
454+
435455
public ModuleElement moduleOf(Elements elements, Element el) {
436456
if (el instanceof TypeElementWrapper)
437457
return moduleOf(elements, ((TypeElementWrapper) el).delegateTo);

0 commit comments

Comments
 (0)