From dbb2c6e86a719cd27b25c9d4c1a72aea0500be11 Mon Sep 17 00:00:00 2001 From: Junichi Yamamoto Date: Fri, 29 Oct 2021 12:56:39 +0900 Subject: [PATCH 1/2] [NETBEANS-3362] Add StructureItem.InheritedItem interface - https://issues.apache.org/jira/browse/NETBEANS-3362 - Add the new interface(`StructureItem.InheritedItem`) to show inherited items on the navigator pane. - Add `StructureItem.isInherited()` - See also http://wiki.apidesign.org/wiki/ExtendingInterfaces --- ide/csl.api/apichanges.xml | 15 ++ ide/csl.api/nbproject/project.properties | 2 +- .../modules/csl/api/StructureItem.java | 38 ++++- .../org/netbeans/modules/csl/api/UiUtils.java | 154 +++++++++--------- .../editor/overridden/ComputeAnnotations.java | 4 + .../csl/navigation/BreadCrumbsTask.java | 4 +- .../csl/navigation/ClassMemberFilters.java | 22 +-- .../modules/csl/navigation/ElementNode.java | 5 + .../csl/navigation/base/FiltersManager.java | 30 ++-- 9 files changed, 176 insertions(+), 98 deletions(-) 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 - } From 89b415ba280687a03e03730f8737ae4d7967a2f1 Mon Sep 17 00:00:00 2001 From: Junichi Yamamoto Date: Tue, 2 Nov 2021 21:55:40 +0900 Subject: [PATCH 2/2] [NETBEANS-3362] Show inherited members on the navigator pane - https://issues.apache.org/jira/browse/NETBEANS-3362 --- php/php.editor/nbproject/project.properties | 2 +- php/php.editor/nbproject/project.xml | 2 +- .../php/editor/csl/NavigatorScanner.java | 134 ++++++++++++++++-- .../php/editor/model/impl/ClassScopeImpl.java | 7 +- .../editor/model/impl/FieldElementImpl.java | 12 +- .../php/editor/model/impl/TraitScopeImpl.java | 4 +- .../structure/deprecatedTypes.pass | 2 +- .../structure/nb3362/traitedClass_01.pass | 41 ++++++ .../structure/nb3362/traitedClass_02.pass | 41 ++++++ .../structure/nb3362/traitedTrait_01.pass | 26 ++++ .../structure/nb3362/traitedTrait_02.pass | 26 ++++ .../testfiles/structure/nb3362/BarTrait.php | 32 +++++ .../testfiles/structure/nb3362/FooTrait.php | 32 +++++ .../structure/nb3362/ParentClass.php | 37 +++++ .../structure/nb3362/traitedClass_01.php | 39 +++++ .../structure/nb3362/traitedClass_02.php | 58 ++++++++ .../structure/nb3362/traitedTrait_01.php | 34 +++++ .../structure/nb3362/traitedTrait_02.php | 42 ++++++ .../php/editor/csl/NavigatorNb3362Test.java | 62 ++++++++ .../modules/php/editor/csl/NavigatorTest.java | 11 +- .../php/editor/csl/PhpNavigatorTestBase.java | 41 ++++-- 21 files changed, 647 insertions(+), 38 deletions(-) create mode 100644 php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_01.pass create mode 100644 php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedClass_02.pass create mode 100644 php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_01.pass create mode 100644 php/php.editor/test/unit/data/goldenfiles/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test/structure/nb3362/traitedTrait_02.pass create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/BarTrait.php create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/FooTrait.php create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/ParentClass.php create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/traitedClass_01.php create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/traitedClass_02.php create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/traitedTrait_01.php create mode 100644 php/php.editor/test/unit/data/testfiles/structure/nb3362/traitedTrait_02.php create mode 100644 php/php.editor/test/unit/src/org/netbeans/modules/php/editor/csl/NavigatorNb3362Test.java 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 scan() { private void processNamespaces(List items, Collection 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 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 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 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 interfaes, protected void appendUsedTraits(Collection 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 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 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 children) { - super(elementHandle, children, "fn"); //NOI18N + this(elementHandle, children, false); + } + + public PHPMethodStructureItem(MethodScope elementHandle, List 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 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 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 children) { - super(elementHandle, children, "con"); //NOI18N + this(elementHandle, children, false); + } + + public PHPConstructorStructureItem(MethodScope elementHandle, List 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 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 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 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 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;