diff --git a/ide/csl.api/apichanges.xml b/ide/csl.api/apichanges.xml
index 1ef923571061..570bf5ef1e67 100644
--- a/ide/csl.api/apichanges.xml
+++ b/ide/csl.api/apichanges.xml
@@ -25,6 +25,21 @@
Common Scripting Language API
+
+
+ Adding a new StructureItem.InheritedItem interface
+
+
+
+
+
+
+ Adding StructureItem.InheritedItem interface which allows defining whether the StructrureItem is an inherited item.
+ Adding also StructrureItem.isInherited static method.
+
+
+
+ Allow subclasses to inject instances to MockLookup
diff --git a/ide/csl.api/nbproject/project.properties b/ide/csl.api/nbproject/project.properties
index bdcfce666532..d9f53eb26885 100644
--- a/ide/csl.api/nbproject/project.properties
+++ b/ide/csl.api/nbproject/project.properties
@@ -15,7 +15,7 @@
# specific language governing permissions and limitations
# under the License.
-spec.version.base=2.71.0
+spec.version.base=2.72.0
is.autoload=true
javac.source=1.8
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/api/StructureItem.java b/ide/csl.api/src/org/netbeans/modules/csl/api/StructureItem.java
index 0295d264438f..4076214f237c 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/api/StructureItem.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/api/StructureItem.java
@@ -42,12 +42,27 @@ public interface StructureItem {
long getEndPosition();
/** Icon to use instead of the default implied by the ElementKind */
@CheckForNull ImageIcon getCustomIcon();
-
+
@Override
public abstract boolean equals(Object o);
@Override
public abstract int hashCode();
+ /**
+ * Check whether the StructureItem is an inherited item.
+ *
+ * @since 2.72.0
+ * @param structureItem the structure item
+ * @return {@code true} if it is an inherited item (a class doesn't override
+ * that member), otherwise {@code false} (a class declares it as an
+ * overriding member)
+ */
+ public static boolean isInherited(StructureItem structureItem) {
+ // see also http://wiki.apidesign.org/wiki/ExtendingInterfaces
+ return structureItem instanceof StructureItem.InheritedItem
+ && ((StructureItem.InheritedItem) structureItem).isInherited();
+ }
+
public interface CollapsedDefault extends StructureItem {
/**
@@ -60,4 +75,25 @@ public interface CollapsedDefault extends StructureItem {
}
+ public interface InheritedItem extends StructureItem {
+
+ /**
+ * Check whether this StructureItem is an inherited item.
+ *
+ * @since 2.72.0
+ * @return {@code true} if it is an inherited item (a class doesn't
+ * override that member), otherwise {@code false} (a class declares it
+ * as an overriding member)
+ */
+ boolean isInherited();
+
+ /**
+ * Get the declaring element handle. e.g. class
+ *
+ * @since 2.72.0
+ * @return the declaring element handle of the inherited item
+ */
+ @NonNull
+ ElementHandle getDeclaringElement();
+ }
}
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/api/UiUtils.java b/ide/csl.api/src/org/netbeans/modules/csl/api/UiUtils.java
index 246c966bdf1b..1aa168530eba 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/api/UiUtils.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/api/UiUtils.java
@@ -57,12 +57,11 @@
import org.openide.text.NbDocument;
import org.openide.util.NbBundle;
-
-/**
- * This file is originally from Retouche, the Java Support
+/**
+ * This file is originally from Retouche, the Java Support
* infrastructure in NetBeans. I have modified the file as little
* as possible to make merging Retouche fixes back as simple as
- * possible.
+ * possible.
*
* This class contains various methods bound to visualization of Java model
* elements. It was formerly included under SourceUtils
@@ -92,7 +91,7 @@ public static boolean open(Source source, ElementHandle handle) {
public static boolean open(final FileObject fo, final int offset) {
assert fo != null;
-
+
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(new Runnable() {
public @Override void run() {
@@ -101,7 +100,7 @@ public static boolean open(final FileObject fo, final int offset) {
});
return true; // not exactly accurate, but....
}
-
+
return doOpen(fo, offset);
}
@@ -240,89 +239,98 @@ private static DeclarationLocation getElementLocation(final Source source, final
if (fileObject != null && fileObject != source.getFileObject()) {
// The element is not in the parse tree for this parse job; it is
// probably something like an indexed element
+ // NETBEANS-3362 inherited items may be in another file
+ DeclarationLocation location = getDeclarationLocation(Source.create(fileObject), handle);
+ if (location != DeclarationLocation.NONE) {
+ return location;
+ }
return new DeclarationLocation(fileObject, -1);
}
+ return getDeclarationLocation(source, handle);
+ }
- final DeclarationLocation[] result = new DeclarationLocation[] { null };
+ private static DeclarationLocation getDeclarationLocation(final Source source, final ElementHandle handle) {
+ final DeclarationLocation[] result = new DeclarationLocation[]{null};
final AtomicBoolean cancel = new AtomicBoolean();
final UserTask t = new UserTask() {
- public @Override void run(ResultIterator resultIterator) throws ParseException {
- if (cancel.get()) {
- return;
- }
- if (resultIterator.getSnapshot().getMimeType().equals(handle.getMimeType())) {
- Parser.Result r = resultIterator.getParserResult();
- if (r instanceof ParserResult) {
- ParserResult info = (ParserResult) r;
- OffsetRange range = handle.getOffsetRange(info);
- if (range != OffsetRange.NONE && range != null) {
- result[0] = new DeclarationLocation(info.getSnapshot().getSource().getFileObject(), range.getStart());
- return;
- }
+ @Override
+ public void run(ResultIterator resultIterator) throws ParseException {
+ if (cancel.get()) {
+ return;
+ }
+ if (resultIterator.getSnapshot().getMimeType().equals(handle.getMimeType())) {
+ Parser.Result r = resultIterator.getParserResult();
+ if (r instanceof ParserResult) {
+ ParserResult info = (ParserResult) r;
+ OffsetRange range = handle.getOffsetRange(info);
+ if (range != OffsetRange.NONE && range != null) {
+ result[0] = new DeclarationLocation(info.getSnapshot().getSource().getFileObject(), range.getStart());
+ return;
}
}
+ }
- for(Embedding e : resultIterator.getEmbeddings()) {
- run(resultIterator.getResultIterator(e));
- if (result[0] != null) {
- break;
- }
+ for (Embedding e : resultIterator.getEmbeddings()) {
+ run(resultIterator.getResultIterator(e));
+ if (result[0] != null) {
+ break;
}
}
- };
-
- if (IndexingManager.getDefault().isIndexing()) {
- int timeout = SwingUtilities.isEventDispatchThread() ? AWT_TIMEOUT : NON_AWT_TIMEOUT;
- Future f;
- try {
- f = ParserManager.parseWhenScanFinished(Collections.singleton(source), t);
- } catch (ParseException ex) {
- LOG.log(Level.WARNING, null, ex);
- return DeclarationLocation.NONE;
- }
+ }
+ };
+
+ if (IndexingManager.getDefault().isIndexing()) {
+ int timeout = SwingUtilities.isEventDispatchThread() ? AWT_TIMEOUT : NON_AWT_TIMEOUT;
+ Future f;
+ try {
+ f = ParserManager.parseWhenScanFinished(Collections.singleton(source), t);
+ } catch (ParseException ex) {
+ LOG.log(Level.WARNING, null, ex);
+ return DeclarationLocation.NONE;
+ }
- try {
- f.get(timeout, TimeUnit.MILLISECONDS);
- } catch (InterruptedException ex) {
- LOG.log(Level.INFO, null, ex);
- return DeclarationLocation.NONE;
- } catch (ExecutionException ex) {
- LOG.log(Level.INFO, null, ex);
- return DeclarationLocation.NONE;
- } catch (TimeoutException ex) {
- f.cancel(true);
- LOG.info("Skipping location of element offset within file, Scannig in progress"); // NOI18N
- return DeclarationLocation.NONE; //we are opening @ 0 position. Fix #160478
- }
+ try {
+ f.get(timeout, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException ex) {
+ LOG.log(Level.INFO, null, ex);
+ return DeclarationLocation.NONE;
+ } catch (ExecutionException ex) {
+ LOG.log(Level.INFO, null, ex);
+ return DeclarationLocation.NONE;
+ } catch (TimeoutException ex) {
+ f.cancel(true);
+ LOG.info("Skipping location of element offset within file, Scannig in progress"); // NOI18N
+ return DeclarationLocation.NONE; //we are opening @ 0 position. Fix #160478
+ }
- if (!f.isDone()) {
- f.cancel(true);
- LOG.info("Skipping location of element offset within file, Scannig in progress"); // NOI18N
- return DeclarationLocation.NONE; //we are opening @ 0 position. Fix #160478
- }
- } else if (SwingUtilities.isEventDispatchThread()) {
- BaseProgressUtils.runOffEventDispatchThread(
+ if (!f.isDone()) {
+ f.cancel(true);
+ LOG.info("Skipping location of element offset within file, Scannig in progress"); // NOI18N
+ return DeclarationLocation.NONE; //we are opening @ 0 position. Fix #160478
+ }
+ } else if (SwingUtilities.isEventDispatchThread()) {
+ BaseProgressUtils.runOffEventDispatchThread(
new Runnable() {
- @Override
- public void run() {
- try {
- ParserManager.parse(Collections.singleton(source), t);
- } catch (ParseException ex) {
- LOG.log(Level.WARNING, null, ex);
- }
- }
- },
+ @Override
+ public void run() {
+ try {
+ ParserManager.parse(Collections.singleton(source), t);
+ } catch (ParseException ex) {
+ LOG.log(Level.WARNING, null, ex);
+ }
+ }
+ },
NbBundle.getMessage(UiUtils.class, "TXT_CalculatingDeclPos"),
cancel,
false);
- } else {
- try {
- ParserManager.parse(Collections.singleton(source), t);
- } catch (ParseException ex) {
- LOG.log(Level.WARNING, null, ex);
- return DeclarationLocation.NONE;
- }
+ } else {
+ try {
+ ParserManager.parse(Collections.singleton(source), t);
+ } catch (ParseException ex) {
+ LOG.log(Level.WARNING, null, ex);
+ return DeclarationLocation.NONE;
}
- return result[0] != null ? result[0] : DeclarationLocation.NONE;
}
+ return result[0] != null ? result[0] : DeclarationLocation.NONE;
}
+}
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/editor/overridden/ComputeAnnotations.java b/ide/csl.api/src/org/netbeans/modules/csl/editor/overridden/ComputeAnnotations.java
index 5db29deb5212..a63de4614415 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/editor/overridden/ComputeAnnotations.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/editor/overridden/ComputeAnnotations.java
@@ -127,6 +127,10 @@ public void run(Result result, SchedulerEvent event) {
while (!todo.isEmpty()) {
StructureItem i = todo.remove(0);
+ if (i instanceof StructureItem.InheritedItem
+ && ((StructureItem.InheritedItem) i).isInherited()) {
+ continue;
+ }
todo.addAll(i.getNestedItems());
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/navigation/BreadCrumbsTask.java b/ide/csl.api/src/org/netbeans/modules/csl/navigation/BreadCrumbsTask.java
index d138b72cacd1..397043d745d9 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/navigation/BreadCrumbsTask.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/navigation/BreadCrumbsTask.java
@@ -122,7 +122,9 @@ private void selectNode(Document doc, StructureItem structureRoot, long id, int
OUTER: while (requestId.get() == id) {
for (Node n : toSelect.getChildren().getNodes(true)) {
StructureItemNode sin = (StructureItemNode) n;
-
+ if (StructureItem.isInherited(sin.item)) {
+ continue;
+ }
if (sin.item.getPosition() <= caret && caret <= sin.item.getEndPosition()) {
toSelect = sin;
// see #223480, mimetype nodes look ugly in the breadcrumb bar
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/navigation/ClassMemberFilters.java b/ide/csl.api/src/org/netbeans/modules/csl/navigation/ClassMemberFilters.java
index c014e628a00f..dddd567510fb 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/navigation/ClassMemberFilters.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/navigation/ClassMemberFilters.java
@@ -84,7 +84,7 @@ public Collection filter(List original) {
boolean non_public = filters.isSelected(SHOW_NON_PUBLIC);
boolean statik = filters.isSelected(SHOW_STATIC);
boolean fields = filters.isSelected(SHOW_FIELDS);
- // XXX Enable later boolean inherited = filters.isSelected(SHOW_INHERITED);
+ boolean inherited = filters.isSelected(SHOW_INHERITED);
if (original == null || original.isEmpty()) {
return Collections.EMPTY_LIST;
@@ -112,7 +112,10 @@ public Collection filter(List original) {
continue;
}
- // XXX Inherited members
+ // Inherited members
+ if (!inherited && StructureItem.isInherited(description)) {
+ continue;
+ }
result.add(description);
}
@@ -140,14 +143,13 @@ public void setNaturalSort( boolean naturalSort ) {
private static FiltersManager createFilters () {
FiltersDescription desc = new FiltersDescription();
- // XXX to be enabled later
-// desc.addFilter(SHOW_INHERITED,
-// NbBundle.getMessage(ClassMemberFilters.class, "LBL_ShowInherited"), //NOI18N
-// NbBundle.getMessage(ClassMemberFilters.class, "LBL_ShowInheritedTip"), //NOI18N
-// false,
-// new ImageIcon (Utilities.loadImage("org/netbeans/modules/csl/navigation/resources/filterHideInherited.png")), //NOI18N
-// null
-// );
+ desc.addFilter(SHOW_INHERITED,
+ NbBundle.getMessage(ClassMemberFilters.class, "LBL_ShowInherited"), //NOI18N
+ NbBundle.getMessage(ClassMemberFilters.class, "LBL_ShowInheritedTip"), //NOI18N
+ false,
+ new ImageIcon (ImageUtilities.loadImage("org/netbeans/modules/csl/navigation/resources/filterHideInherited.png")), //NOI18N
+ null
+ );
desc.addFilter(SHOW_FIELDS,
NbBundle.getMessage(ClassMemberFilters.class, "LBL_ShowFields"), //NOI18N
NbBundle.getMessage(ClassMemberFilters.class, "LBL_ShowFieldsTip"), //NOI18N
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java b/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java
index 79aecf9f28ad..077d3f6289e7 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/navigation/ElementNode.java
@@ -242,6 +242,11 @@ public ElementNode getNodeForOffset(int offset) {
Node[] children = ch.getNodes();
for (int i = 0; i < children.length; i++) {
ElementNode c = (ElementNode) children[i];
+ if (this.getFileObject() != c.getDescription().getElementHandle().getFileObject()) {
+ // e.g. inherited items may be in another file
+ // in such a case, incorrect item is highlighted on the navigator window if the FileObjects are not checked
+ continue;
+ }
long start = c.getDescription().getPosition();
if (start <= offset) {
long end = c.getDescription().getEndPosition();
diff --git a/ide/csl.api/src/org/netbeans/modules/csl/navigation/base/FiltersManager.java b/ide/csl.api/src/org/netbeans/modules/csl/navigation/base/FiltersManager.java
index 790e89349be9..04198d8fa7c9 100644
--- a/ide/csl.api/src/org/netbeans/modules/csl/navigation/base/FiltersManager.java
+++ b/ide/csl.api/src/org/netbeans/modules/csl/navigation/base/FiltersManager.java
@@ -27,6 +27,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.prefs.Preferences;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.Icon;
@@ -36,6 +37,7 @@
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
import javax.swing.event.ChangeEvent;
+import org.openide.util.NbPreferences;
/**
* This file is originally from Retouche, the Java Support
@@ -118,7 +120,7 @@ private class FiltersComponent extends Box implements ActionListener {
private FilterChangeListener clientL;
/** lock for map of filter states */
- private Object STATES_LOCK = new Object();
+ private final Object STATES_LOCK = new Object();
/** copy of filter states for accessing outside AWT */
private Map filterStates;
@@ -228,19 +230,23 @@ private void initPanel () {
filterStates = fStates;
}
}
-
- private JToggleButton createToggle (Map fStates, int index) {
- boolean isSelected = filtersDesc.isSelected(index);
+
+ private Preferences getPreferences() {
+ return NbPreferences.forModule(FiltersManager.class);
+ }
+
+ private JToggleButton createToggle(Map fStates, int index) {
+ boolean isSelected = getPreferences().getBoolean(filtersDesc.getName(index), filtersDesc.isSelected(index));
Icon icon = filtersDesc.getSelectedIcon(index);
// ensure small size, just for the icon
JToggleButton result = new JToggleButton(icon, isSelected);
Dimension size = new Dimension(icon.getIconWidth() + 6, icon.getIconHeight() + 4);
result.setPreferredSize(size);
- result.setMargin(new Insets(2,3,2,3));
+ result.setMargin(new Insets(2, 3, 2, 3));
result.setToolTipText(filtersDesc.getTooltip(index));
-
+
fStates.put(filtersDesc.getName(index), Boolean.valueOf(isSelected));
-
+
return result;
}
@@ -260,18 +266,20 @@ private int filterIndexForName (String filterName) {
}
/** Reactions to toggle button click, */
+ @Override
public void actionPerformed(ActionEvent e) {
// copy changed state first
JToggleButton toggle = (JToggleButton)e.getSource();
int index = toggles.indexOf(e.getSource());
synchronized (STATES_LOCK) {
- filterStates.put(filtersDesc.getName(index),
- Boolean.valueOf(toggle.isSelected()));
+ filterStates.put(filtersDesc.getName(index), toggle.isSelected());
+ // remember filter settings
+ getPreferences().putBoolean(filtersDesc.getName(index), toggle.isSelected());
}
// notify
fireChange();
}
-
+
private void fireChange () {
FilterChangeListener lCopy;
synchronized (L_LOCK) {
@@ -285,7 +293,5 @@ private void fireChange () {
// notify listener
lCopy.filterStateChanged(new ChangeEvent(FiltersManager.this));
}
-
} // end of FiltersComponent
-
}
diff --git a/php/php.editor/nbproject/project.properties b/php/php.editor/nbproject/project.properties
index 7fe9b0bd9d74..b6c93c1a2daf 100644
--- a/php/php.editor/nbproject/project.properties
+++ b/php/php.editor/nbproject/project.properties
@@ -20,7 +20,7 @@ build.compiler=extJavac
nbjavac.ignore.missing.enclosing=**/CUP$ASTPHP5Parser$actions.class
javac.compilerargs=-J-Xmx512m
nbm.needs.restart=true
-spec.version.base=2.6.0
+spec.version.base=2.7.0
release.external/predefined_vars-1.0.zip=docs/predefined_vars.zip
sigtest.gen.fail.on.error=false
diff --git a/php/php.editor/nbproject/project.xml b/php/php.editor/nbproject/project.xml
index 72f55801ea69..601b6752c878 100644
--- a/php/php.editor/nbproject/project.xml
+++ b/php/php.editor/nbproject/project.xml
@@ -84,7 +84,7 @@
2
- 2.50
+ 2.72
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/csl/NavigatorScanner.java b/php/php.editor/src/org/netbeans/modules/php/editor/csl/NavigatorScanner.java
index 804cc8a2b94a..c7f3f4e3e2af 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/csl/NavigatorScanner.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/csl/NavigatorScanner.java
@@ -21,11 +21,13 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
+import org.netbeans.api.annotations.common.StaticResource;
import org.netbeans.modules.csl.api.ElementHandle;
import org.netbeans.modules.csl.api.ElementKind;
import org.netbeans.modules.csl.api.HtmlFormatter;
@@ -65,6 +67,7 @@
* @author Ondrej Brejla
*/
public final class NavigatorScanner {
+
private static final Logger LOGGER = Logger.getLogger(NavigatorScanner.class.getName());
private static final String FONT_GRAY_COLOR = ""; //NOI18N
private static final String CLOSE_FONT = ""; //NOI18N
@@ -78,6 +81,8 @@ public static NavigatorScanner create(Model model, boolean resolveDeprecatedElem
return new NavigatorScanner(model, resolveDeprecatedElements);
}
+ private static final Comparator TRAIT_SCOPE_COMPARATOR = (TraitScope o1, TraitScope o2) -> o1.getName().compareToIgnoreCase(o2.getName());
+
private NavigatorScanner(Model model, boolean resolveDeprecatedElements) {
fileScope = model.getFileScope();
if (resolveDeprecatedElements) {
@@ -99,7 +104,7 @@ public List extends StructureItem> scan() {
private void processNamespaces(List items, Collection extends NamespaceScope> declaredNamespaces) {
for (NamespaceScope nameScope : declaredNamespaces) {
- List namespaceChildren = nameScope.isDefaultNamespace() ? items : new ArrayList();
+ List namespaceChildren = nameScope.isDefaultNamespace() ? items : new ArrayList<>();
if (!nameScope.isDefaultNamespace()) {
items.add(new PHPNamespaceStructureItem(nameScope, namespaceChildren));
}
@@ -134,6 +139,9 @@ private void processTypes(List items, List namespa
} else if (type instanceof TraitScope) {
namespaceChildren.add(new PHPTraitStructureItem((TraitScope) type, children));
}
+
+ // methods
+ Set declMethodNames = new HashSet<>();
Collection extends MethodScope> declaredMethods = type.getDeclaredMethods();
for (MethodScope method : declaredMethods) {
// The method name doesn't have to be always defined during parsing.
@@ -146,17 +154,49 @@ private void processTypes(List items, List namespa
} else {
children.add(new PHPMethodStructureItem(method, variables));
}
+ declMethodNames.add(method.getName());
+ }
+ }
+ // inherited methods
+ for (MethodScope inheritedMethod : type.getInheritedMethods()) {
+ if (!inheritedMethod.getName().isEmpty() && !declMethodNames.contains(inheritedMethod.getName())) {
+ List variables = new ArrayList<>();
+ if (inheritedMethod.isConstructor()) {
+ children.add(new PHPConstructorStructureItem(inheritedMethod, variables, true));
+ } else {
+ children.add(new PHPMethodStructureItem(inheritedMethod, variables, true));
+ }
}
}
+
+ // constants
+ Set declClsConstantNames = new HashSet<>();
Collection extends ClassConstantElement> declaredClsConstants = type.getDeclaredConstants();
for (ClassConstantElement classConstant : declaredClsConstants) {
- children.add(new PHPConstantStructureItem(classConstant, "con")); //NOI18N
+ children.add(new PHPClassConstantStructureItem(classConstant, "con")); //NOI18N
+ declClsConstantNames.add(classConstant.getName());
+ }
+ // inherited constants
+ for (ClassConstantElement inheritedConstant : type.getInheritedConstants()) {
+ if (!declClsConstantNames.contains(inheritedConstant.getName())) {
+ children.add(new PHPClassConstantStructureItem(inheritedConstant, "con", true)); //NOI18N
+ }
}
+
if (type instanceof ClassScope) {
ClassScope cls = (ClassScope) type;
+ // fields
+ Set declaredFieldNames = new HashSet<>();
Collection extends FieldElement> declaredFields = cls.getDeclaredFields();
for (FieldElement field : declaredFields) {
children.add(new PHPFieldStructureItem(field));
+ declaredFieldNames.add(field.getName());
+ }
+ // inherited fields
+ for (FieldElement inheritedField : cls.getInheritedFields()) {
+ if (!declaredFieldNames.contains(inheritedField.getName())) {
+ children.add(new PHPFieldStructureItem(inheritedField, true));
+ }
}
}
if (type instanceof TraitScope) {
@@ -297,7 +337,9 @@ protected void appendInterfaces(Collection extends InterfaceScope> interfaes,
protected void appendUsedTraits(Collection extends TraitScope> usedTraits, HtmlFormatter formatter) {
boolean first = true;
- for (TraitScope traitScope : usedTraits) {
+ List traits = new ArrayList<>(usedTraits);
+ Collections.sort(traits, TRAIT_SCOPE_COMPARATOR);
+ for (TraitScope traitScope : traits) {
if (!first) {
formatter.appendText(", "); //NOI18N
} else {
@@ -419,9 +461,38 @@ protected void appendName(ModelElement modelElement, HtmlFormatter formatter) {
}
}
- private class PHPFieldStructureItem extends PHPSimpleStructureItem {
+
+ private abstract class PHPStructureInheritedItem extends PHPStructureItem implements StructureItem.InheritedItem {
+
+ private final boolean isInherited;
+
+ public PHPStructureInheritedItem(ModelElement elementHandle, List extends StructureItem> children, String sortPrefix, boolean isInherited) {
+ super(elementHandle, children, sortPrefix);
+ this.isInherited = isInherited;
+ }
+
+ @Override
+ public boolean isInherited() {
+ return isInherited;
+ }
+
+ @Override
+ public ElementHandle getDeclaringElement() {
+ return getModelElement().getInScope();
+ }
+ }
+
+ private class PHPFieldStructureItem extends PHPSimpleStructureItem implements StructureItem.InheritedItem {
+
+ private final boolean isInherited;
+
public PHPFieldStructureItem(FieldElement elementHandle) {
+ this(elementHandle, false);
+ }
+
+ public PHPFieldStructureItem(FieldElement elementHandle, boolean isInherited) {
super(elementHandle, "field"); //NOI18N
+ this.isInherited = isInherited;
}
public FieldElement getField() {
@@ -454,7 +525,17 @@ public String getHtml(HtmlFormatter formatter) {
return formatter.getText();
}
+ @Override
+ public boolean isInherited() {
+ return isInherited;
+ }
+
+ @Override
+ public ElementHandle getDeclaringElement() {
+ return getField().getInScope();
+ }
}
+
private class PHPSimpleStructureItem extends PHPStructureItem {
private String simpleText;
@@ -607,6 +688,31 @@ public String getHtml(HtmlFormatter formatter) {
}
+ private class PHPClassConstantStructureItem extends PHPConstantStructureItem implements StructureItem.InheritedItem {
+
+ private boolean isInherited;
+
+ public PHPClassConstantStructureItem(ConstantElement elementHandle, String prefix) {
+ this(elementHandle, prefix, false);
+ }
+
+ public PHPClassConstantStructureItem(ConstantElement elementHandle, String prefix, boolean isInherited) {
+ super(elementHandle, prefix);
+ this.isInherited = isInherited;
+ }
+
+ @Override
+ public boolean isInherited() {
+ return isInherited;
+ }
+
+ @Override
+ public ElementHandle getDeclaringElement() {
+ return getConstant().getInScope();
+ }
+
+ }
+
private class PHPFunctionStructureItem extends PHPStructureItem {
public PHPFunctionStructureItem(FunctionScope elementHandle, List extends StructureItem> children) {
@@ -626,10 +732,14 @@ public String getHtml(HtmlFormatter formatter) {
}
- private class PHPMethodStructureItem extends PHPStructureItem {
+ private class PHPMethodStructureItem extends PHPStructureInheritedItem {
public PHPMethodStructureItem(MethodScope elementHandle, List extends StructureItem> children) {
- super(elementHandle, children, "fn"); //NOI18N
+ this(elementHandle, children, false);
+ }
+
+ public PHPMethodStructureItem(MethodScope elementHandle, List extends StructureItem> children, boolean isInherited) {
+ super(elementHandle, children, "fn", isInherited); //NOI18N
}
public MethodScope getMethodScope() {
@@ -646,6 +756,8 @@ public String getHtml(HtmlFormatter formatter) {
}
private class PHPInterfaceStructureItem extends PHPStructureItem {
+
+ @StaticResource
private static final String PHP_INTERFACE_ICON = "org/netbeans/modules/php/editor/resources/interface.png"; //NOI18N
private final Collection extends InterfaceScope> interfaces;
@@ -681,6 +793,8 @@ public String getHtml(HtmlFormatter formatter) {
}
private class PHPTraitStructureItem extends PHPStructureItem {
+
+ @StaticResource
private static final String PHP_TRAIT_ICON = "org/netbeans/modules/php/editor/resources/trait.png"; //NOI18N
private final Collection extends TraitScope> usedTraits;
@@ -715,10 +829,14 @@ public String getHtml(HtmlFormatter formatter) {
}
- private class PHPConstructorStructureItem extends PHPStructureItem {
+ private class PHPConstructorStructureItem extends PHPStructureInheritedItem {
public PHPConstructorStructureItem(MethodScope elementHandle, List extends StructureItem> children) {
- super(elementHandle, children, "con"); //NOI18N
+ this(elementHandle, children, false);
+ }
+
+ public PHPConstructorStructureItem(MethodScope elementHandle, List extends StructureItem> children, boolean isInherited) {
+ super(elementHandle, children, "con", isInherited); //NOI18N
}
@Override
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
index 644e8af9bda8..cd7ca933ea8f 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
@@ -328,7 +328,7 @@ public Collection extends FieldElement> getInheritedFields() {
}
}
for (TraitScope traitScope : new HashSet<>(getTraits())) {
- Set indexedFields = filterForPrivate.filter(index.getAlllFields(traitScope));
+ Set indexedFields = index.getAlllFields(traitScope);
for (org.netbeans.modules.php.editor.api.elements.FieldElement field : indexedFields) {
allFields.add(new FieldElementImpl(traitScope, field));
}
@@ -341,9 +341,10 @@ public final Collection extends ClassConstantElement> getInheritedConstants()
Set allConstants = new HashSet<>();
IndexScope indexScope = ModelUtils.getIndexScope(this);
ElementQuery.Index index = indexScope.getIndex();
+ org.netbeans.modules.php.editor.api.elements.ElementFilter filterForPrivate = org.netbeans.modules.php.editor.api.elements.ElementFilter.forPrivateModifiers(false);
Set superClasses = new HashSet<>(getSuperClasses());
for (ClassScope classScope : superClasses) {
- Set indexedConstants = index.getAllTypeConstants(classScope);
+ Set indexedConstants = filterForPrivate.filter(index.getAllTypeConstants(classScope));
for (TypeConstantElement classMember : indexedConstants) {
TypeConstantElement constant = classMember;
allConstants.add(new ClassConstantElementImpl(classScope, constant));
@@ -352,7 +353,7 @@ public final Collection extends ClassConstantElement> getInheritedConstants()
Set interfaceScopes = new HashSet<>();
interfaceScopes.addAll(getSuperInterfaceScopes());
for (InterfaceScope iface : interfaceScopes) {
- Collection indexedConstants = index.getInheritedTypeConstants(iface);
+ Collection indexedConstants = filterForPrivate.filter(index.getInheritedTypeConstants(iface));
for (TypeConstantElement classMember : indexedConstants) {
TypeConstantElement constant = classMember;
allConstants.add(new ClassConstantElementImpl(iface, constant));
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
index 726b8803c418..bd23ababbac9 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/FieldElementImpl.java
@@ -99,7 +99,17 @@ class FieldElementImpl extends ScopeImpl implements FieldElement {
for (TypeResolver typeResolver : instanceTypes) {
if (typeResolver.isResolved()) {
QualifiedName typeName = typeResolver.getTypeName(false);
- String type = typeName == null ? "" : typeName.toNamespaceName() + "\\" + typeName.getName(); // NOI18N
+ String type;
+ if (typeName == null) {
+ type = ""; // NOI18N
+ } else {
+ if (typeName.toNamespaceName().toString().isEmpty()
+ && Type.isPrimitive(typeName.getName())) {
+ type = typeName.getName();
+ } else {
+ type = typeName.toNamespaceName() + "\\" + typeName.getName(); // NOI18N
+ }
+ }
if (this.defaultType != null) {
this.defaultType += String.format("|%s", type); //NOI18N
} else {
diff --git a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/TraitScopeImpl.java b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/TraitScopeImpl.java
index 01bda9533e7d..6f98eeb000b1 100644
--- a/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/TraitScopeImpl.java
+++ b/php/php.editor/src/org/netbeans/modules/php/editor/model/impl/TraitScopeImpl.java
@@ -147,8 +147,8 @@ public String getIndexSignature() {
sb.append(getName()).append(Signature.ITEM_DELIMITER);
sb.append(getOffset()).append(Signature.ITEM_DELIMITER);
NamespaceScope namespaceScope = ModelUtils.getNamespaceScope(this);
- assert namespaceScope != null;
- QualifiedName qualifiedName = namespaceScope.getQualifiedName();
+ // if inScope is IndexScope, namespaceScope is null
+ QualifiedName qualifiedName = namespaceScope != null ? namespaceScope.getQualifiedName() : QualifiedName.create(""); // NOI18N
sb.append(qualifiedName.toString()).append(Signature.ITEM_DELIMITER);
if (!usedTraits.isEmpty()) {
StringBuilder traitSb = new StringBuilder();
diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorDeprecatedTest/structure/deprecatedTypes.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorDeprecatedTest/structure/deprecatedTypes.pass
index 8a1e84ee5e96..0acd76985c0b 100644
--- a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorDeprecatedTest/structure/deprecatedTypes.pass
+++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorDeprecatedTest/structure/deprecatedTypes.pass
@@ -1,7 +1,7 @@
|-Hhh [16, 276] : ESCAPED{Hhh}
|--\Omm\DeprType [26, 39] : DEPRECATED{ESCAPED{\Omm\DeprType}}
|--ClassName [48, 274] : ESCAPED{ClassName}
-|---barBaz [215, 271] : ESCAPED{barBaz}ESCAPED{(}DEPRECATED{ESCAPED{\Omm\DeprType}}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:DEPRECATED{ESCAPED{\Omm\DeprType}}
|---$foo [116, 119] : ESCAPED{$foo}:DEPRECATED{ESCAPED{\Omm\DeprType}}
+|---barBaz [215, 271] : ESCAPED{barBaz}ESCAPED{(}DEPRECATED{ESCAPED{\Omm\DeprType}}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:DEPRECATED{ESCAPED{\Omm\DeprType}}
|-Omm [287, 332] : ESCAPED{Omm}
|--DeprType [318, 330] : DEPRECATED{ESCAPED{DeprType}}
diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_01.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_01.pass
new file mode 100644
index 000000000000..b6cf8b9d8c0f
--- /dev/null
+++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_01.pass
@@ -0,0 +1,41 @@
+|-Test [17, 1116] : ESCAPED{Test}
+|--ChildClass [30, 1116] : ESCAPED{ChildClass}::ESCAPED{ParentClass}#ESCAPED{FooTrait}
+|---(Inherited) $publicFooTraitField [58, 78] : ESCAPED{$publicFooTraitField}:ESCAPED{int}
+|---(Inherited) $privateFooTraitField [96, 117] : ESCAPED{$privateFooTraitField}:ESCAPED{int}
+|---(Inherited) $protectedFooTraitField [137, 160] : ESCAPED{$protectedFooTraitField}:ESCAPED{int}
+|---(Inherited) $publicStaticFooTraitField [185, 211] : ESCAPED{$publicStaticFooTraitField}:ESCAPED{int}
+|---(Inherited) $privateStaticFooTraitField [236, 263] : ESCAPED{$privateStaticFooTraitField}:ESCAPED{int}
+|---(Inherited) $protectedStaticFooTraitField [290, 319] : ESCAPED{$protectedStaticFooTraitField}:ESCAPED{int}
+|---(Inherited) publicFooTraitMethod [341, 361] : ESCAPED{publicFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateFooTraitMethod [410, 431] : ESCAPED{privateFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedFooTraitMethod [499, 522] : ESCAPED{protectedFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicStaticFooTraitMethod [594, 620] : ESCAPED{publicStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateStaticFooTraitMethod [676, 703] : ESCAPED{privateStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticFooTraitMethod [778, 807] : ESCAPED{protectedStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) IMPLICIT_PUBLIC_PARENT_CONST [55, 83] : ESCAPED{IMPLICIT_PUBLIC_PARENT_CONST}ESCAPED{ }ESCAPED{"parent"}
+|---(Inherited) PUBLIC_PARENT_CONST [113, 132] : ESCAPED{PUBLIC_PARENT_CONST}ESCAPED{ }ESCAPED{"parent"}
+|---(Inherited) PROTECTED_PARENT_CONST [216, 238] : ESCAPED{PROTECTED_PARENT_CONST}ESCAPED{ }ESCAPED{"parent"}
+|---(Inherited) $publicParentClassField [268, 291] : ESCAPED{$publicParentClassField}:ESCAPED{int}
+|---(Inherited) $protectedParentClassField [353, 379] : ESCAPED{$protectedParentClassField}:ESCAPED{int}
+|---(Inherited) $publicStaticParentClassField [404, 433] : ESCAPED{$publicStaticParentClassField}:ESCAPED{int}
+|---(Inherited) $protectedStaticParentClassField [515, 547] : ESCAPED{$protectedStaticParentClassField}:ESCAPED{int}
+|---(Inherited) publicParentClassMethod [569, 592] : ESCAPED{publicParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedParentClassMethod [733, 759] : ESCAPED{protectedParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicStaticParentClassMethod [831, 860] : ESCAPED{publicStaticParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticParentClassMethod [1021, 1053] : ESCAPED{protectedStaticParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---IMPLICIT_PUBLIC_CHILD_CONST [93, 120] : ESCAPED{IMPLICIT_PUBLIC_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PUBLIC_CHILD_CONST [149, 167] : ESCAPED{PUBLIC_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PRIVATE_CHILD_CONST [197, 216] : ESCAPED{PRIVATE_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PROTECTED_CHILD_CONST [248, 269] : ESCAPED{PROTECTED_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---$publicChildClassField [298, 319] : ESCAPED{$publicChildClassField}:ESCAPED{int}
+|---$privateChildClassField [338, 360] : ESCAPED{$privateChildClassField}:ESCAPED{int}
+|---$protectedChildClassField [381, 405] : ESCAPED{$protectedChildClassField}:ESCAPED{int}
+|---$publicStaticChildClassField [431, 458] : ESCAPED{$publicStaticChildClassField}:ESCAPED{int}
+|---$privateStaticChildClassField [484, 512] : ESCAPED{$privateStaticChildClassField}:ESCAPED{int}
+|---$protectedStaticChildClassField [540, 570] : ESCAPED{$protectedStaticChildClassField}:ESCAPED{int}
+|---publicChildClassMethod [593, 641] : ESCAPED{publicChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateChildClassMethod [664, 730] : ESCAPED{privateChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedChildClassMethod [755, 823] : ESCAPED{protectedChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---publicStaticChildClassMethod [852, 906] : ESCAPED{publicStaticChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateStaticChildClassMethod [936, 1008] : ESCAPED{privateStaticChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedStaticChildClassMethod [1040, 1114] : ESCAPED{protectedStaticChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_02.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_02.pass
new file mode 100644
index 000000000000..75dadc1ae748
--- /dev/null
+++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_02.pass
@@ -0,0 +1,41 @@
+|-Test [17, 1673] : ESCAPED{Test}
+|--ChildClass [30, 1673] : ESCAPED{ChildClass}::ESCAPED{ParentClass}#ESCAPED{FooTrait}
+|---(Inherited) $publicFooTraitField [58, 78] : ESCAPED{$publicFooTraitField}:ESCAPED{int}
+|---(Inherited) $privateFooTraitField [96, 117] : ESCAPED{$privateFooTraitField}:ESCAPED{int}
+|---(Inherited) $protectedFooTraitField [137, 160] : ESCAPED{$protectedFooTraitField}:ESCAPED{int}
+|---(Inherited) $publicStaticFooTraitField [185, 211] : ESCAPED{$publicStaticFooTraitField}:ESCAPED{int}
+|---(Inherited) $privateStaticFooTraitField [236, 263] : ESCAPED{$privateStaticFooTraitField}:ESCAPED{int}
+|---(Inherited) $protectedStaticFooTraitField [290, 319] : ESCAPED{$protectedStaticFooTraitField}:ESCAPED{int}
+|---(Inherited) publicFooTraitMethod [341, 361] : ESCAPED{publicFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedFooTraitMethod [499, 522] : ESCAPED{protectedFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateStaticFooTraitMethod [676, 703] : ESCAPED{privateStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticFooTraitMethod [778, 807] : ESCAPED{protectedStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) IMPLICIT_PUBLIC_PARENT_CONST [55, 83] : ESCAPED{IMPLICIT_PUBLIC_PARENT_CONST}ESCAPED{ }ESCAPED{"parent"}
+|---(Inherited) PROTECTED_PARENT_CONST [216, 238] : ESCAPED{PROTECTED_PARENT_CONST}ESCAPED{ }ESCAPED{"parent"}
+|---(Inherited) $publicParentClassField [268, 291] : ESCAPED{$publicParentClassField}:ESCAPED{int}
+|---(Inherited) $protectedStaticParentClassField [515, 547] : ESCAPED{$protectedStaticParentClassField}:ESCAPED{int}
+|---(Inherited) publicParentClassMethod [569, 592] : ESCAPED{publicParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticParentClassMethod [1021, 1053] : ESCAPED{protectedStaticParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---IMPLICIT_PUBLIC_CHILD_CONST [93, 120] : ESCAPED{IMPLICIT_PUBLIC_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PUBLIC_CHILD_CONST [149, 167] : ESCAPED{PUBLIC_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PRIVATE_CHILD_CONST [197, 216] : ESCAPED{PRIVATE_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PROTECTED_CHILD_CONST [248, 269] : ESCAPED{PROTECTED_CHILD_CONST}ESCAPED{ }ESCAPED{"child"}
+|---PUBLIC_PARENT_CONST [314, 333] : ESCAPED{PUBLIC_PARENT_CONST}ESCAPED{ }ESCAPED{"child"}
+|---$publicChildClassField [362, 383] : ESCAPED{$publicChildClassField}:ESCAPED{int}
+|---$privateChildClassField [402, 424] : ESCAPED{$privateChildClassField}:ESCAPED{int}
+|---$protectedChildClassField [445, 469] : ESCAPED{$protectedChildClassField}:ESCAPED{int}
+|---$protectedParentClassField [506, 531] : ESCAPED{$protectedParentClassField}:ESCAPED{int}
+|---$publicStaticChildClassField [557, 584] : ESCAPED{$publicStaticChildClassField}:ESCAPED{int}
+|---$privateStaticChildClassField [610, 638] : ESCAPED{$privateStaticChildClassField}:ESCAPED{int}
+|---$protectedStaticChildClassField [666, 696] : ESCAPED{$protectedStaticChildClassField}:ESCAPED{int}
+|---$publicStaticParentClassField [737, 765] : ESCAPED{$publicStaticParentClassField}:ESCAPED{int}
+|---publicChildClassMethod [788, 836] : ESCAPED{publicChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateChildClassMethod [859, 925] : ESCAPED{privateChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedChildClassMethod [950, 1018] : ESCAPED{protectedChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---publicStaticChildClassMethod [1047, 1101] : ESCAPED{publicStaticChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateStaticChildClassMethod [1131, 1203] : ESCAPED{privateStaticChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedStaticChildClassMethod [1235, 1309] : ESCAPED{protectedStaticChildClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---privateFooTraitMethod [1348, 1412] : ESCAPED{privateFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedParentClassMethod [1437, 1506] : ESCAPED{protectedParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---publicStaticFooTraitMethod [1535, 1587] : ESCAPED{publicStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---publicStaticParentClassMethod [1616, 1671] : ESCAPED{publicStaticParentClassMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_01.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_01.pass
new file mode 100644
index 000000000000..e6af267113f1
--- /dev/null
+++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_01.pass
@@ -0,0 +1,26 @@
+|-Test [17, 920] : ESCAPED{Test}
+|--FooBarTrait [30, 920] : ESCAPED{FooBarTrait}#ESCAPED{BarTrait}ESCAPED{, }ESCAPED{FooTrait}
+|---(Inherited) publicBarTraitMethod [341, 361] : ESCAPED{publicBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateBarTraitMethod [410, 431] : ESCAPED{privateBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedBarTraitMethod [499, 522] : ESCAPED{protectedBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicStaticBarTraitMethod [594, 620] : ESCAPED{publicStaticBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateStaticBarTraitMethod [676, 703] : ESCAPED{privateStaticBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticBarTraitMethod [778, 807] : ESCAPED{protectedStaticBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicFooTraitMethod [341, 361] : ESCAPED{publicFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateFooTraitMethod [410, 431] : ESCAPED{privateFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedFooTraitMethod [499, 522] : ESCAPED{protectedFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicStaticFooTraitMethod [594, 620] : ESCAPED{publicStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateStaticFooTraitMethod [676, 703] : ESCAPED{privateStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticFooTraitMethod [778, 807] : ESCAPED{protectedStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---$publicFooBarTraitField [90, 112] : ESCAPED{$publicFooBarTraitField}:ESCAPED{int}
+|---$privateFooBarTraitField [131, 154] : ESCAPED{$privateFooBarTraitField}:ESCAPED{int}
+|---$protectedFooBarTraitField [175, 200] : ESCAPED{$protectedFooBarTraitField}:ESCAPED{int}
+|---$publicStaticFooBarTraitField [226, 254] : ESCAPED{$publicStaticFooBarTraitField}:ESCAPED{int}
+|---$privateStaticFooBarTraitField [280, 309] : ESCAPED{$privateStaticFooBarTraitField}:ESCAPED{int}
+|---$protectedStaticFooBarTraitField [337, 368] : ESCAPED{$protectedStaticFooBarTraitField}:ESCAPED{int}
+|---publicFooBarTraitMethod [391, 440] : ESCAPED{publicFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateFooBarTraitMethod [463, 530] : ESCAPED{privateFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedFooBarTraitMethod [555, 624] : ESCAPED{protectedFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---publicStaticFooBarTraitMethod [653, 708] : ESCAPED{publicStaticFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateStaticFooBarTraitMethod [738, 811] : ESCAPED{privateStaticFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedStaticFooBarTraitMethod [843, 918] : ESCAPED{protectedStaticFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
diff --git a/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_02.pass b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_02.pass
new file mode 100644
index 000000000000..9e7ad38dfeb3
--- /dev/null
+++ b/php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_02.pass
@@ -0,0 +1,26 @@
+|-Test [17, 1107] : ESCAPED{Test}
+|--FooBarTrait [30, 1107] : ESCAPED{FooBarTrait}#ESCAPED{BarTrait}ESCAPED{, }ESCAPED{FooTrait}
+|---(Inherited) publicBarTraitMethod [341, 361] : ESCAPED{publicBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateBarTraitMethod [410, 431] : ESCAPED{privateBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedBarTraitMethod [499, 522] : ESCAPED{protectedBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicStaticBarTraitMethod [594, 620] : ESCAPED{publicStaticBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticBarTraitMethod [778, 807] : ESCAPED{protectedStaticBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateFooTraitMethod [410, 431] : ESCAPED{privateFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedFooTraitMethod [499, 522] : ESCAPED{protectedFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) publicStaticFooTraitMethod [594, 620] : ESCAPED{publicStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) privateStaticFooTraitMethod [676, 703] : ESCAPED{privateStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---(Inherited) protectedStaticFooTraitMethod [778, 807] : ESCAPED{protectedStaticFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---$publicFooBarTraitField [90, 112] : ESCAPED{$publicFooBarTraitField}:ESCAPED{int}
+|---$privateFooBarTraitField [131, 154] : ESCAPED{$privateFooBarTraitField}:ESCAPED{int}
+|---$protectedFooBarTraitField [175, 200] : ESCAPED{$protectedFooBarTraitField}:ESCAPED{int}
+|---$publicStaticFooBarTraitField [226, 254] : ESCAPED{$publicStaticFooBarTraitField}:ESCAPED{int}
+|---$privateStaticFooBarTraitField [280, 309] : ESCAPED{$privateStaticFooBarTraitField}:ESCAPED{int}
+|---$protectedStaticFooBarTraitField [337, 368] : ESCAPED{$protectedStaticFooBarTraitField}:ESCAPED{int}
+|---publicFooBarTraitMethod [391, 440] : ESCAPED{publicFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateFooBarTraitMethod [463, 530] : ESCAPED{privateFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedFooBarTraitMethod [555, 624] : ESCAPED{protectedFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---publicStaticFooBarTraitMethod [653, 708] : ESCAPED{publicStaticFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateStaticFooBarTraitMethod [738, 811] : ESCAPED{privateStaticFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---protectedStaticFooBarTraitMethod [843, 918] : ESCAPED{protectedStaticFooBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
+|---publicFooTraitMethod [956, 1002] : ESCAPED{publicFooTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param}ESCAPED{)}:ESCAPED{void}
+|---privateStaticBarTraitMethod [1034, 1104] : ESCAPED{privateStaticBarTraitMethod}ESCAPED{(}ESCAPED{int}ESCAPED{ }ESCAPED{$param1}ESCAPED{, }ESCAPED{string}ESCAPED{ }ESCAPED{$param2}ESCAPED{)}:ESCAPED{void}
diff --git a/php/php.editor/test/unit/data/testfiles/structure/nb3362/BarTrait.php b/php/php.editor/test/unit/data/testfiles/structure/nb3362/BarTrait.php
new file mode 100644
index 000000000000..bde91d63314c
--- /dev/null
+++ b/php/php.editor/test/unit/data/testfiles/structure/nb3362/BarTrait.php
@@ -0,0 +1,32 @@
+ createClassPathsForTest() {
+ return Collections.singletonMap(
+ PhpSourcePath.SOURCE_CP,
+ ClassPathSupport.createClassPath(new FileObject[] {
+ FileUtil.toFileObject(new File(getDataDir(), "/testfiles/structure/nb3362"))
+ })
+ );
+ }
+}
diff --git a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
index b9b04e6413fd..44db901d0ff0 100644
--- a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
+++ b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorTest.java
@@ -16,14 +16,13 @@
* specific language governing permissions and limitations
* under the License.
*/
-
package org.netbeans.modules.php.editor.csl;
/**
*
* @author Petr Pisl
*/
-public class NavigatorTest extends PhpNavigatorTestBase{
+public class NavigatorTest extends PhpNavigatorTestBase {
public NavigatorTest(String testName) {
super(testName);
@@ -31,20 +30,20 @@ public NavigatorTest(String testName) {
public void testNamespace() throws Exception {
performTest("structure/php53/namespace");
-
}
+
public void testMultiple_namespaces() throws Exception {
performTest("structure/php53/multiple_namespaces");
-
}
+
public void testBracketedMultipleNamespaces() throws Exception {
performTest("structure/php53/bracketed_multiple_namespaces");
-
}
+
public void testBracketedMultipleNamespacesWithDefaultOne() throws Exception {
performTest("structure/php53/bracketed_multiple_namespaces_with_default_one");
-
}
+
public void testScan() throws Exception {
performTest("structure/interface_001");
}
diff --git a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/PhpNavigatorTestBase.java b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/PhpNavigatorTestBase.java
index 30d714be23d8..d82ea076e73c 100644
--- a/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/PhpNavigatorTestBase.java
+++ b/php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/PhpNavigatorTestBase.java
@@ -46,6 +46,18 @@ public PhpNavigatorTestBase(String testName) {
super(testName);
}
+ private static final Comparator STRUCTURE_ITEM_COMPARATOR = (StructureItem o1, StructureItem o2) -> {
+ String path1 = o1.getElementHandle().getFileObject().getPath();
+ String path2 = o2.getElementHandle().getFileObject().getPath();
+ int result = path1.compareToIgnoreCase(path2);
+ if (result == 0) {
+ long position1 = o1.getPosition();
+ long position2 = o2.getPosition();
+ result = Long.compare(position1, position2);
+ }
+ return result;
+ };
+
@Override
protected String getTestResult(String filename) throws Exception {
StringBuilder sb = new StringBuilder();
@@ -64,7 +76,7 @@ protected boolean isResolveDeprecatedElements() {
UserTask task = new UserTask() {
@Override
public void run(ResultIterator resultIterator) throws Exception {
- PHPParseResult info = (PHPParseResult)resultIterator.getParserResult();
+ PHPParseResult info = (PHPParseResult) resultIterator.getParserResult();
if (info != null) {
result.addAll(instance.scan(info));
}
@@ -81,18 +93,10 @@ public void run(ResultIterator resultIterator) throws Exception {
}
}
- Comparator comparator = new Comparator() {
- @Override
- public int compare(StructureItem o1, StructureItem o2) {
- long position1 = o1.getPosition();
- long position2 = o2.getPosition();
- return (int) (position1 - position2);
- }
- };
- Collections.sort(result,comparator);
+ Collections.sort(result, STRUCTURE_ITEM_COMPARATOR);
for (StructureItem structureItem : result) {
- Collections.sort(structureItem.getNestedItems(),comparator);
+ Collections.sort(structureItem.getNestedItems(), STRUCTURE_ITEM_COMPARATOR);
sb.append(printStructureItem(structureItem, 0));
sb.append("\n");
}
@@ -102,24 +106,31 @@ public int compare(StructureItem o1, StructureItem o2) {
private String printStructureItem(StructureItem structureItem, int indent) {
StringBuilder sb = new StringBuilder();
sb.append(indent(indent));
+ if (structureItem instanceof StructureItem.InheritedItem) {
+ if (((StructureItem.InheritedItem) structureItem).isInherited()) {
+ sb.append("(Inherited) ");
+ }
+ }
sb.append(structureItem.getName());
sb.append(" [");
sb.append(structureItem.getPosition());
sb.append(", ");
sb.append(structureItem.getEndPosition());
sb.append("] : ");
- HtmlFormatter formatter = new TestHtmlFormatter() ;
+ HtmlFormatter formatter = new TestHtmlFormatter();
sb.append(structureItem.getHtml(formatter));
- for (StructureItem item : structureItem.getNestedItems()) {
+ List extends StructureItem> nestedItems = structureItem.getNestedItems();
+ Collections.sort(nestedItems, STRUCTURE_ITEM_COMPARATOR);
+ for (StructureItem item : nestedItems) {
sb.append("\n");
- sb.append(printStructureItem(item, indent+1));
+ sb.append(printStructureItem(item, indent + 1));
}
return sb.toString();
}
private String indent(int indent) {
String text = "|-";
- for (int i = 0; i < indent; i++ ) {
+ for (int i = 0; i < indent; i++) {
text = text + "-";
}
return text;