This is an automated email from the ASF dual-hosted git repository.
lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 0b4ca34b5e Code cleanup for csl.editor.semantic package
0b4ca34b5e is described below
commit 0b4ca34b5e8f660e730d397be142eaf534caa07d
Author: Laszlo Kishalmi <[email protected]>
AuthorDate: Sun Dec 8 14:46:30 2024 -0800
Code cleanup for csl.editor.semantic package
---
ide/csl.api/nbproject/project.properties | 2 +-
.../csl/editor/semantic/ColoringManager.java | 21 +-
.../csl/editor/semantic/GsfSemanticLayer.java | 271 ++++++++-------------
.../modules/csl/editor/semantic/HighlightImpl.java | 162 ------------
.../semantic/HighlightsLayerFactoryImpl.java | 1 +
.../semantic/MarkOccurrencesHighlighter.java | 29 +--
.../editor/semantic/OccurrencesMarkProvider.java | 71 +++---
.../semantic/OccurrencesMarkProviderCreator.java | 1 +
.../csl/editor/semantic/SemanticHighlighter.java | 203 +++------------
.../csl/editor/semantic/SequenceElement.java | 66 +----
.../csl/editor/semantic/SequenceElementTest.java | 74 ------
11 files changed, 196 insertions(+), 705 deletions(-)
diff --git a/ide/csl.api/nbproject/project.properties
b/ide/csl.api/nbproject/project.properties
index f809db633e..7637f0c316 100644
--- a/ide/csl.api/nbproject/project.properties
+++ b/ide/csl.api/nbproject/project.properties
@@ -17,7 +17,7 @@
spec.version.base=2.85.0
is.autoload=true
-javac.source=1.8
+javac.release=17
javadoc.overview=${basedir}/doc/overview.html
javadoc.arch=${basedir}/arch.xml
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/ColoringManager.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/ColoringManager.java
index c17c7396d7..e13dd0f88e 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/ColoringManager.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/ColoringManager.java
@@ -36,6 +36,7 @@ import java.util.logging.Logger;
import javax.swing.text.AttributeSet;
import javax.swing.text.Document;
import javax.swing.text.JTextComponent;
+import org.netbeans.api.annotations.common.NonNull;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.editor.mimelookup.MimePath;
import org.netbeans.api.editor.settings.AttributesUtilities;
@@ -61,7 +62,7 @@ import org.openide.util.NbBundle;
* @author Jan Lahoda
*/
public final class ColoringManager {
- private String mimeType;
+ private final String mimeType;
private final Map<Set<ColoringAttributes>, String> type2Coloring;
//private static final Font ITALIC =
SettingsDefaults.defaultFont.deriveFont(Font.ITALIC);
@@ -71,7 +72,7 @@ public final class ColoringManager {
public ColoringManager(String mimeType) {
this.mimeType = mimeType;
- type2Coloring = new LinkedHashMap<Set<ColoringAttributes>, String>();
+ type2Coloring = new LinkedHashMap<>();
put("mark-occurrences", MARK_OCCURRENCES);
put("mod-abstract", ABSTRACT);
@@ -123,7 +124,7 @@ public final class ColoringManager {
type2Coloring.put(attribs, coloring);
}
- Map<Set<ColoringAttributes>,Coloring> COLORING_MAP = new
IdentityHashMap<Set<ColoringAttributes>, Coloring>();
+ final Map<Set<ColoringAttributes>,Coloring> COLORING_MAP = new
IdentityHashMap<>();
public Coloring getColoring(Set<ColoringAttributes> attrs) {
Coloring c = COLORING_MAP.get(attrs);
@@ -139,7 +140,8 @@ public final class ColoringManager {
return c;
}
-
+
+ @NonNull
public AttributeSet getColoringImpl(Coloring colorings) {
FontColorSettings fcs =
MimeLookup.getLookup(MimePath.get(mimeType)).lookup(FontColorSettings.class);
@@ -150,7 +152,7 @@ public final class ColoringManager {
assert fcs != null;
- List<AttributeSet> attribs = new LinkedList<AttributeSet>();
+ List<AttributeSet> attribs = new LinkedList<>();
EnumSet<ColoringAttributes> es =
EnumSet.noneOf(ColoringAttributes.class);
@@ -184,13 +186,11 @@ public final class ColoringManager {
Collections.reverse(attribs);
- AttributeSet result =
AttributesUtilities.createComposite(attribs.toArray(new AttributeSet[0]));
-
- return result;
+ return
AttributesUtilities.createComposite(attribs.toArray(AttributeSet[]::new));
}
private static AttributeSet adjustAttributes(AttributeSet as) {
- Collection<Object> attrs = new LinkedList<Object>();
+ Collection<Object> attrs = new LinkedList<>();
for (Enumeration<?> e = as.getAttributeNames(); e.hasMoreElements(); )
{
Object key = e.nextElement();
@@ -205,8 +205,9 @@ public final class ColoringManager {
return AttributesUtilities.createImmutable(attrs.toArray());
}
- final class UnusedTooltipResolver implements
HighlightAttributeValue<String> {
+ private final class UnusedTooltipResolver implements
HighlightAttributeValue<String> {
+ @Override
public String getValue(JTextComponent component, Document document,
Object attributeKey, int startOffset, final int endOffset) {
return NbBundle.getMessage(ColoringManager.class, "LBL_UNUSED");
}
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/GsfSemanticLayer.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/GsfSemanticLayer.java
index 4b55286d76..266e2bb536 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/GsfSemanticLayer.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/GsfSemanticLayer.java
@@ -26,14 +26,10 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.AttributeSet;
import javax.swing.text.Document;
-import javax.swing.text.SimpleAttributeSet;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.editor.mimelookup.MimePath;
import org.netbeans.api.editor.settings.FontColorSettings;
@@ -53,128 +49,87 @@ import org.openide.util.WeakListeners;
*
* @author Tor Norbye
*/
-public class GsfSemanticLayer extends AbstractHighlightsContainer implements
DocumentListener {
+public final class GsfSemanticLayer extends AbstractHighlightsContainer
implements DocumentListener {
- // -J-Dorg.netbeans.modules.csl.editor.semantic.GsfSemanticLayer.level=FINE
- private static final Logger LOG =
Logger.getLogger(GsfSemanticLayer.class.getName());
-
- //private Map<Token, Coloring> colorings;
- private SortedSet<SequenceElement> colorings;
- private int version;
+ private List<SequenceElement> colorings = List.of();
private List<Edit> edits;
- private Map<Language,Map<Coloring, AttributeSet>> CACHE = new
HashMap<Language,Map<Coloring, AttributeSet>>();
- private Document doc;
- private List<Lookup.Result> coloringResults = new
ArrayList<Lookup.Result>(3);
- private List<LookupListener> coloringListeners = new
ArrayList<LookupListener>(3);
+ private final Map<Language,Map<Coloring, AttributeSet>> cache = new
HashMap<>();
+ private final Document doc;
+
+ // Write only - used to keep strong reference to
Lookup.Result/LookupListener
+ @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
+ private final List<Lookup.Result> coloringResults = new ArrayList<>(3);
+ @SuppressWarnings("MismatchedQueryAndUpdateOfCollection")
+ private final List<LookupListener> coloringListeners = new ArrayList<>(3);
public static GsfSemanticLayer getLayer(Class id, Document doc) {
GsfSemanticLayer l = (GsfSemanticLayer) doc.getProperty(id);
if (l == null) {
- doc.putProperty(id, l = new GsfSemanticLayer(doc));
+ l = new GsfSemanticLayer(doc);
+ doc.putProperty(id, l);
}
return l;
}
- private static final SortedSet<SequenceElement> EMPTY_TREE_SET = new
TreeSet<SequenceElement>();
-
private GsfSemanticLayer(Document doc) {
this.doc = doc;
- this.colorings = EMPTY_TREE_SET;
- this.version = -1;
}
- //public void setColorings(final SortedMap<OffsetRange, Coloring>
colorings/*, final Set<OffsetRange> addedTokens, final Set<OffsetRange>
removedTokens*/) {
- void setColorings(final SortedSet<SequenceElement> colorings, final int
version /*, final Set<OffsetRange> addedTokens, final Set<OffsetRange>
removedTokens*/) {
- doc.render(new Runnable() {
- public @Override void run() {
- synchronized (GsfSemanticLayer.this) {
- GsfSemanticLayer.this.colorings = colorings;
- GsfSemanticLayer.this.edits = new ArrayList<Edit>();
- GsfSemanticLayer.this.version = version;
-
- // I am not accurately computing it here
- //if (addedTokens.isEmpty()) {
- // //need to fire anything here?
- //} else {
- // if (addedTokens.size() == 1) {
- // OffsetRange t = addedTokens.iterator().next();
- //
- // //fireHighlightsChange(t.offset(null),
t.offset(null) + t.length()); //XXX: locking
- // fireHighlightsChange(t.getStart(), t.getEnd());
//XXX: locking
- // } else {
- fireHighlightsChange(0, doc.getLength()); //XXX:
locking
- // }
- //}
-
- DocumentUtilities.removeDocumentListener(doc,
GsfSemanticLayer.this, DocumentListenerPriority.LEXER);
- DocumentUtilities.addDocumentListener(doc,
GsfSemanticLayer.this, DocumentListenerPriority.LEXER);
- }
+ void setColorings(final SortedSet<SequenceElement> colorings) {
+ doc.render(() -> {
+ synchronized (GsfSemanticLayer.this) {
+ GsfSemanticLayer.this.colorings = List.copyOf(colorings);
+ GsfSemanticLayer.this.edits = new ArrayList<>();
+
+ fireHighlightsChange(0, doc.getLength()); //XXX: locking
+
+ DocumentUtilities.removeDocumentListener(doc,
GsfSemanticLayer.this, DocumentListenerPriority.LEXER);
+ DocumentUtilities.addDocumentListener(doc,
GsfSemanticLayer.this, DocumentListenerPriority.LEXER);
}
});
}
- synchronized SortedSet<SequenceElement> getColorings() {
- return colorings;
- }
-
- synchronized int getVersion() {
- return version;
- }
-
@Override
public synchronized HighlightsSequence getHighlights(int startOffset, int
endOffset) {
if (colorings.isEmpty()) {
return HighlightsSequence.EMPTY;
}
-
- return new GsfHighlightSequence(this, doc, startOffset, endOffset,
colorings);
+ int seqStart = firstSequenceElement(colorings, startOffset);
+ return new GsfHighlightSequence(colorings.listIterator(seqStart));
}
public synchronized void clearColoringCache() {
- CACHE.clear();
+ cache.clear();
}
private synchronized void clearLanguageColoring(Language mime) {
- CACHE.remove(mime);
+ cache.remove(mime);
}
- synchronized AttributeSet getColoring(Coloring c, final Language language)
{
- AttributeSet a = null;
- Map<Coloring,AttributeSet> map = CACHE.get(language);
- if (map == null) {
- final String mime = language.getMimeType();
- a = language.getColoringManager().getColoringImpl(c);
- map = new HashMap<Coloring,AttributeSet>();
- map.put(c, a);
- CACHE.put(language, map);
- Lookup.Result<FontColorSettings> res =
MimeLookup.getLookup(MimePath.get(mime)).lookupResult(FontColorSettings.class);
- coloringResults.add(res);
- LookupListener l;
-
- res.addLookupListener(
- WeakListeners.create(LookupListener.class,
- l = new LookupListener() {
- @Override
- public void resultChanged(LookupEvent ev) {
- clearLanguageColoring(language);
- fireHighlightsChange(0, doc.getLength());
- }
- }, res)
- );
- coloringListeners.add(l);
- } else {
- a = map.get(c);
- if (a == null) {
- map.put(c, a =
language.getColoringManager().getColoringImpl(c));
- }
- }
- if (a == null) {
- LOG.log(Level.FINE, "Null AttributeSet for coloring {0} in
language {1}", new Object [] { c, language });
- }
- return a;
+ synchronized AttributeSet getColoring(Coloring coloring, final Language
language) {
+ Map<Coloring,AttributeSet> langColoring =
cache.computeIfAbsent(language, (lang) -> {
+ registerColoringChangeListener(lang);
+ return new HashMap<>();
+ });
+ return langColoring.computeIfAbsent(coloring, (c) ->
language.getColoringManager().getColoringImpl(c));
+ }
+
+ private void registerColoringChangeListener(Language language) {
+ String mime = language.getMimeType();
+ Lookup.Result<FontColorSettings> res =
MimeLookup.getLookup(MimePath.get(mime)).lookupResult(FontColorSettings.class);
+ coloringResults.add(res);
+ LookupListener l = (LookupEvent ev) -> {
+ clearLanguageColoring(language);
+ fireHighlightsChange(0, doc.getLength());
+ };
+
+ res.addLookupListener(
+ WeakListeners.create(LookupListener.class, l , res)
+ );
+ coloringListeners.add(l);
}
@Override
@@ -197,29 +152,20 @@ public class GsfSemanticLayer extends
AbstractHighlightsContainer implements Doc
// Compute an adjusted offset
public int getShiftedPos(int pos) {
- List<Edit> list = edits;
- int len = list.size();
- if (len == 0) {
- return pos;
- }
- for (int i = 0; i < len; i++) {
- Edit edit = list.get(i);
- if (pos > edit.offset) {
- if (edit.insert) {
- pos += edit.len;
- } else if (pos < edit.offset+edit.len) {
- pos = edit.offset;
+ int ret = pos;
+
+ for (Edit edit: edits) {
+ if (ret > edit.offset()) {
+ if (edit.insert()) {
+ ret += edit.len();
+ } else if (ret < edit.offset() + edit.len()) {
+ ret = edit.offset();
} else {
- pos -= edit.len;
+ ret -= edit.len();
}
}
}
-
- if (pos < 0) {
- pos = 0;
- }
-
- return pos;
+ return ret;
}
/**
@@ -233,17 +179,7 @@ public class GsfSemanticLayer extends
AbstractHighlightsContainer implements Doc
* of ranges (e.g. for every highlight in the whole document) whereas
asking for the
* current positions is typically only done for the highlights visible on
the screen.
*/
- private class Edit {
- public Edit(int offset, int len, boolean insert) {
- this.offset = offset;
- this.len = len;
- this.insert = insert;
- }
-
- int offset;
- int len;
- boolean insert; // true: insert, false: delete
- }
+ private record Edit(int offset, int len, boolean insert) {}
/**
* An implementation of a HighlightsSequence which can show OffsetRange
@@ -251,77 +187,62 @@ public class GsfSemanticLayer extends
AbstractHighlightsContainer implements Doc
*
* @author Tor Norbye
*/
- private static final class GsfHighlightSequence implements
HighlightsSequence {
- private Iterator<SequenceElement> iterator;
+ private final class GsfHighlightSequence implements HighlightsSequence {
+ private final Iterator<SequenceElement> iterator;
private SequenceElement element;
- private final GsfSemanticLayer layer;
- private final int endOffset;
- private SequenceElement nextElement;
- private int nextElementStartOffset = Integer.MAX_VALUE;
- GsfHighlightSequence(GsfSemanticLayer layer, Document doc,
- int startOffset, int endOffset,
- SortedSet<SequenceElement> colorings) {
- this.layer = layer;
- this.endOffset = endOffset;
-
- SequenceElement.ComparisonItem fromInclusive = new
SequenceElement.ComparisonItem(startOffset);
- SortedSet<SequenceElement> subMap =
colorings.tailSet(fromInclusive);
- iterator = subMap.iterator();
- }
-
- private SequenceElement fetchElementFromIterator(boolean
updateNextElementStartOffset) {
- int seStartOffset;
- SequenceElement se;
- if (iterator != null && iterator.hasNext()) {
- se = iterator.next();
- seStartOffset = se.range.getStart();
- if (LOG.isLoggable(Level.FINE)) {
- LOG.log(Level.FINE, "Fetched highlight <{0},{1}>\n", //
NOI18N
- new Object[]{seStartOffset, se.range.getEnd()});
- }
- if (seStartOffset >= endOffset) {
- se = null;
- seStartOffset = Integer.MAX_VALUE;
- iterator = null;
- }
- } else {
- se = null;
- seStartOffset = Integer.MAX_VALUE;
- iterator = null;
- }
- if (updateNextElementStartOffset) {
- nextElementStartOffset = seStartOffset;
- }
- return se;
+ GsfHighlightSequence(Iterator<SequenceElement> it) {
+ iterator = it;
}
@Override
public boolean moveNext() {
- if (nextElement != null) {
- element = nextElement;
- nextElement = fetchElementFromIterator(true);
- } else {
- if ((element = fetchElementFromIterator(false)) != null) {
- nextElement = fetchElementFromIterator(true);
- }
- }
- return (element != null);
+ element = iterator.hasNext() ? iterator.next() : null;
+ return element != null;
}
@Override
public int getStartOffset() {
- return layer.getShiftedPos(element.range.getStart());
+ return getShiftedPos(element.range().getStart());
}
@Override
public int getEndOffset() {
- return layer.getShiftedPos(element.range.getEnd());
+ return getShiftedPos(element.range().getEnd());
}
@Override
public AttributeSet getAttributes() {
- return layer.getColoring(element.coloring, element.language);
+ return getColoring(element.coloring(), element.language());
}
}
+
+ /**
+ * Binary search for the first SequenceElement that is left to the offset
and
+ * returns its index in the list.
+ *
+ * This is used to get an optimized iterator for GsfHighlightSequence
+ * @param l ordered list of SequenceElements
+ * @param offset The offset in the document.
+ * @return the index of the first SequenceElement that is left to the
offset
+ */
+ private static int firstSequenceElement(List<SequenceElement> l, int
offset) {
+ int low = 0;
+ int high = l.size() - 1;
+
+ while (low <= high) {
+ int mid = (low + high) >>> 1;
+ SequenceElement midVal = l.get(mid);
+ int cmp = midVal.range().getStart() - offset;
+
+ if (cmp < 0)
+ low = mid + 1;
+ else if (cmp > 0)
+ high = mid - 1;
+ else
+ return mid;
+ }
+ return low;
+ }
+
}
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightImpl.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightImpl.java
deleted file mode 100644
index 456b4775f1..0000000000
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightImpl.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.netbeans.modules.csl.editor.semantic;
-
-
-import java.text.MessageFormat;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Document;
-import javax.swing.text.StyledDocument;
-import org.netbeans.api.lexer.Token;
-import org.netbeans.modules.csl.api.ColoringAttributes;
-import org.openide.text.NbDocument;
-
-/**
- * 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.
- *
- *
- * @author Jan Lahoda
- */
-public final class HighlightImpl {
-
- private Document doc;
- private int start;
- private int end;
- private Collection<ColoringAttributes> colorings;
-
- public HighlightImpl(Document doc, Token token,
Collection<ColoringAttributes> colorings) {
- this.doc = doc;
- this.start = token.offset(null);
- this.end = token.offset(null) + token.text().length();
- this.colorings = colorings;
- }
-
- public HighlightImpl(Document doc, int start, int end,
Collection<ColoringAttributes> colorings) {
- this.doc = doc;
- this.start = start;
- this.end = end;
- this.colorings = colorings;
- }
-
- public int getStart() {
- return start;
- }
-
- public int getEnd() {
- return end;
- }
-
- public String getHighlightTestData() {
- int lineStart = NbDocument.findLineNumber((StyledDocument) doc, start);
- int columnStart = NbDocument.findLineColumn((StyledDocument) doc,
start);
- int lineEnd = NbDocument.findLineNumber((StyledDocument) doc, end);
- int columnEnd = NbDocument.findLineColumn((StyledDocument) doc, end);
-
- return coloringsToString() + ", " + lineStart + ":" + columnStart +
"-" + lineEnd + ":" + columnEnd;
- }
-
- private String coloringsToString() {
- StringBuffer result = new StringBuffer();
- boolean first = true;
-
- result.append("[");
-
- for (ColoringAttributes attribute : coloringsAttributesOrder) {
- if (colorings.contains(attribute)) {
- if (!first) {
- result.append(", ");
- }
-
- first = false;
- result.append(attribute.name());
- }
- }
-
- result.append("]");
-
- return result.toString();
- }
-
- Collection<ColoringAttributes> coloringsAttributesOrder =
Arrays.asList(new ColoringAttributes[] {
- ColoringAttributes.ABSTRACT,
- ColoringAttributes.ANNOTATION_TYPE,
- ColoringAttributes.CLASS,
- ColoringAttributes.CONSTRUCTOR,
- ColoringAttributes.CUSTOM1,
- ColoringAttributes.CUSTOM2,
- ColoringAttributes.CUSTOM3,
- ColoringAttributes.DECLARATION,
- ColoringAttributes.DEPRECATED,
- ColoringAttributes.ENUM,
- ColoringAttributes.FIELD,
- ColoringAttributes.GLOBAL,
- ColoringAttributes.INTERFACE,
- ColoringAttributes.LOCAL_VARIABLE,
- ColoringAttributes.MARK_OCCURRENCES,
- ColoringAttributes.METHOD,
- ColoringAttributes.PACKAGE_PRIVATE,
- ColoringAttributes.PARAMETER,
- ColoringAttributes.PRIVATE,
- ColoringAttributes.PROTECTED,
- ColoringAttributes.PUBLIC,
- ColoringAttributes.REGEXP,
- ColoringAttributes.STATIC,
- ColoringAttributes.TYPE_PARAMETER_DECLARATION,
- ColoringAttributes.TYPE_PARAMETER_USE,
- ColoringAttributes.UNDEFINED,
- ColoringAttributes.UNUSED,
- });
-
- public static HighlightImpl parse(StyledDocument doc, String line) throws
ParseException, BadLocationException {
- MessageFormat f = new MessageFormat("[{0}],
{1,number,integer}:{2,number,integer}-{3,number,integer}:{4,number,integer}");
- Object[] args = f.parse(line);
-
- String attributesString = (String) args[0];
- int lineStart = ((Long) args[1]).intValue();
- int columnStart = ((Long) args[2]).intValue();
- int lineEnd = ((Long) args[3]).intValue();
- int columnEnd = ((Long) args[4]).intValue();
-
- String[] attrElements = attributesString.split(",");
- List<ColoringAttributes> attributes = new
ArrayList<ColoringAttributes>();
-
- for (String a : attrElements) {
- a = a.trim();
-
- attributes.add(ColoringAttributes.valueOf(a));
- }
-
- if (attributes.contains(null))
- throw new NullPointerException();
-
- int offsetStart = NbDocument.findLineOffset(doc, lineStart) +
columnStart;
- int offsetEnd = NbDocument.findLineOffset(doc, lineEnd) + columnEnd;
-
- return new HighlightImpl(doc, offsetStart, offsetEnd, attributes);
- }
-
-}
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightsLayerFactoryImpl.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightsLayerFactoryImpl.java
index 3e5950f205..1b97904c17 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightsLayerFactoryImpl.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/HighlightsLayerFactoryImpl.java
@@ -35,6 +35,7 @@ import org.netbeans.spi.editor.highlighting.ZOrder;
*/
public class HighlightsLayerFactoryImpl implements HighlightsLayerFactory {
+ @Override
public HighlightsLayer[] createLayers(Context context) {
//LexerBasedHighlightLayer semantic =
LexerBasedHighlightLayer.getLayer(SemanticHighlighter.class,
context.getDocument());
GsfSemanticLayer semantic =
GsfSemanticLayer.getLayer(SemanticHighlighter.class, context.getDocument());
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/MarkOccurrencesHighlighter.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/MarkOccurrencesHighlighter.java
index 5ded13490f..a4da4578f1 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/MarkOccurrencesHighlighter.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/MarkOccurrencesHighlighter.java
@@ -19,7 +19,6 @@
package org.netbeans.modules.csl.editor.semantic;
import java.awt.Color;
-import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
@@ -63,8 +62,8 @@ public final class MarkOccurrencesHighlighter extends
ParserResultTask<ParserRes
private final CancelSupportImplementation cancel =
SchedulerTaskCancelSupportImpl.create(this);
private final Language language;
private final Snapshot snapshot;
- private int version;
- static Coloring MO = ColoringAttributes.add(ColoringAttributes.empty(),
ColoringAttributes.MARK_OCCURRENCES);
+
+ static final Coloring MO =
ColoringAttributes.add(ColoringAttributes.empty(),
ColoringAttributes.MARK_OCCURRENCES);
/** Creates a new instance of SemanticHighlighter */
MarkOccurrencesHighlighter(Language language, Snapshot snapshot) {
@@ -78,6 +77,7 @@ public final class MarkOccurrencesHighlighter extends
ParserResultTask<ParserRes
// return snapshot.getSource().getDocument(false);
// }
//
+ @Override
public void run(ParserResult info, SchedulerEvent event) {
SpiSupportAccessor.getInstance().setCancelSupport(cancel);
try {
@@ -107,29 +107,20 @@ public final class MarkOccurrencesHighlighter extends
ParserResultTask<ParserRes
}
List<OffsetRange> bag = processImpl(info, doc, caretPosition);
- if(bag == null) {
+ if (bag.isEmpty() || cancel.isCancelled()) {
//the occurrences finder haven't found anything, just ignore
the result
//and keep the previous occurrences
return ;
}
- if (cancel.isCancelled()) {
- return;
- }
-
GsfSemanticLayer layer =
GsfSemanticLayer.getLayer(MarkOccurrencesHighlighter.class, doc);
SortedSet seqs = new TreeSet<SequenceElement>();
- if (bag.size() > 0) {
- for (OffsetRange range : bag) {
- if (range != OffsetRange.NONE) {
- SequenceElement s = new SequenceElement(language,
range, MO);
- seqs.add(s);
- }
- }
- }
-
- layer.setColorings(seqs, version++);
+ bag.stream()
+ .filter(range -> range != OffsetRange.NONE)
+ .forEach(range -> seqs.add(new SequenceElement(language,
range, MO)));
+
+ layer.setColorings(seqs);
OccurrencesMarkProvider.get(doc).setOccurrences(OccurrencesMarkProvider.createMarks(doc,
bag, ES_COLOR, NbBundle.getMessage(MarkOccurrencesHighlighter.class,
"LBL_ES_TOOLTIP")));
} finally {
@@ -155,7 +146,7 @@ public final class MarkOccurrencesHighlighter extends
ParserResultTask<ParserRes
Map<OffsetRange, ColoringAttributes> highlights =
finder.getOccurrences();
- return highlights == null ? null : new
ArrayList<OffsetRange>(highlights.keySet());
+ return List.copyOf(highlights.keySet());
}
@Override
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProvider.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProvider.java
index 4e6d81a385..78b3c0d169 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProvider.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProvider.java
@@ -50,14 +50,15 @@ import org.openide.util.Exceptions;
*/
public class OccurrencesMarkProvider extends MarkProvider {
- private static Map<Document, Reference<OccurrencesMarkProvider>> providers
= new WeakHashMap<Document, Reference<OccurrencesMarkProvider>>();
+ private static final Map<Document, Reference<OccurrencesMarkProvider>>
providers = new WeakHashMap<>();
public static synchronized OccurrencesMarkProvider get(Document doc) {
Reference<OccurrencesMarkProvider> ref = providers.get(doc);
OccurrencesMarkProvider p = ref != null ? ref.get() : null;
if (p == null) {
- providers.put(doc, new WeakReference(p = new
OccurrencesMarkProvider()));
+ p = new OccurrencesMarkProvider();
+ providers.put(doc, new WeakReference(p));
}
return p;
@@ -74,6 +75,7 @@ public class OccurrencesMarkProvider extends MarkProvider {
joint = Collections.emptyList();
}
+ @Override
public synchronized List getMarks() {
return joint;
}
@@ -83,14 +85,16 @@ public class OccurrencesMarkProvider extends MarkProvider {
List<Mark> nue;
synchronized (this) {
- semantic = new ArrayList<Mark>(s);
+ semantic = new ArrayList<>(s);
old = joint;
- nue = joint = new ArrayList<Mark>();
+ nue = new ArrayList<>();
- joint.addAll(semantic);
- joint.addAll(occurrences);
+ nue.addAll(semantic);
+ nue.addAll(occurrences);
+
+ joint = nue;
}
//#85919: fire outside the lock:
@@ -102,14 +106,16 @@ public class OccurrencesMarkProvider extends MarkProvider
{
List<Mark> nue;
synchronized (this) {
- occurrences = new ArrayList<Mark>(s);
+ occurrences = new ArrayList<>(s);
old = joint;
- nue = joint = new ArrayList<Mark>();
+ nue = new ArrayList<>();
- joint.addAll(semantic);
- joint.addAll(occurrences);
+ nue.addAll(semantic);
+ nue.addAll(occurrences);
+
+ joint = nue;
}
//#85919: fire outside the lock:
@@ -118,21 +124,19 @@ public class OccurrencesMarkProvider extends MarkProvider
{
//public static Collection<Mark> createMarks(final Document doc, final
List<int[]> bag, final Color color, final String tooltip) {
public static Collection<Mark> createMarks(final Document doc, final
List<OffsetRange> bag, final Color color, final String tooltip) {
- final List<Mark> result = new LinkedList<Mark>();
+ final List<Mark> result = new LinkedList<>();
- doc.render(new Runnable() {
- public void run() {
- //for (int[] span : bag) {
- for (OffsetRange span : bag) {
- try {
- //if (span[0] < doc.getLength()) {
- if (span.getStart() < doc.getLength()) {
- //result.add(new MarkImpl(doc,
doc.createPosition(span[0]), color, tooltip));
- result.add(new MarkImpl(doc,
doc.createPosition(span.getStart()), color, tooltip));
- }
- } catch (BadLocationException ex) {
- Exceptions.printStackTrace(ex);
+ doc.render(() -> {
+ //for (int[] span : bag) {
+ for (OffsetRange span : bag) {
+ try {
+ //if (span[0] < doc.getLength()) {
+ if (span.getStart() < doc.getLength()) {
+ //result.add(new MarkImpl(doc,
doc.createPosition(span[0]), color, tooltip));
+ result.add(new MarkImpl(doc,
doc.createPosition(span.getStart()), color, tooltip));
}
+ } catch (BadLocationException ex) {
+ Exceptions.printStackTrace(ex);
}
}
});
@@ -140,45 +144,38 @@ public class OccurrencesMarkProvider extends MarkProvider
{
return result;
}
- private static final class MarkImpl implements Mark {
-
- private Document doc;
- private Position startOffset;
- private Color color;
- private String tooltip;
-
- public MarkImpl(Document doc, Position startOffset, Color color,
String tooltip) {
- this.doc = doc;
- this.startOffset = startOffset;
- this.color = color;
- this.tooltip = tooltip;
- }
+ private static final record MarkImpl(Document doc, Position startOffset,
Color color, String tooltip) implements Mark {
+ @Override
public int getType() {
return TYPE_ERROR_LIKE;
}
+ @Override
public Status getStatus() {
return Status.STATUS_OK;
}
+ @Override
public int getPriority() {
return PRIORITY_DEFAULT;
}
+ @Override
public Color getEnhancedColor() {
return color;
}
+ @Override
public int[] getAssignedLines() {
int line = NbDocument.findLineNumber((StyledDocument) doc,
startOffset.getOffset());
return new int[] {line, line};
}
+ @Override
public String getShortDescription() {
return tooltip;
}
-
}
}
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProviderCreator.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProviderCreator.java
index 8f6f16063e..5254057753 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProviderCreator.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/OccurrencesMarkProviderCreator.java
@@ -37,6 +37,7 @@ public class OccurrencesMarkProviderCreator implements
MarkProviderCreator{
public OccurrencesMarkProviderCreator() {
}
+ @Override
public MarkProvider createMarkProvider(JTextComponent pane) {
return OccurrencesMarkProvider.get(pane.getDocument());
}
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SemanticHighlighter.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SemanticHighlighter.java
index f5ae99e4c2..1176d17125 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SemanticHighlighter.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SemanticHighlighter.java
@@ -41,7 +41,6 @@ import org.netbeans.modules.parsing.api.Embedding;
import org.netbeans.modules.parsing.api.ParserManager;
import org.netbeans.modules.parsing.api.ResultIterator;
import org.netbeans.modules.parsing.api.Source;
-import org.netbeans.modules.parsing.api.UserTask;
import org.netbeans.modules.parsing.spi.*;
@@ -65,10 +64,6 @@ public final class SemanticHighlighter extends
IndexingAwareParserResultTask<Par
super(TaskIndexingMode.ALLOWED_DURING_SCAN);
}
-// public Document getDocument() {
-// return snapshot.getSource().getDocument();
-// }
-//
@Override
public int getPriority() {
return Integer.MAX_VALUE;
@@ -80,6 +75,7 @@ public final class SemanticHighlighter extends
IndexingAwareParserResultTask<Par
}
+ @Override
public final void cancel() {
}
@@ -93,32 +89,9 @@ public final class SemanticHighlighter extends
IndexingAwareParserResultTask<Par
long startTime = System.currentTimeMillis();
Source source = info.getSnapshot().getSource();
- final SortedSet<SequenceElement> newColoring = new
TreeSet<SequenceElement>();
+ final SortedSet<SequenceElement> newColoring = new TreeSet<>();
try {
- ParserManager.parse(Collections.singleton(source), new
UserTask() {
- public @Override void run(ResultIterator resultIterator)
throws Exception {
- String mimeType =
resultIterator.getSnapshot().getMimeType();
- Language language =
LanguageRegistry.getInstance().getLanguageByMimeType(mimeType);
- if (language != null) {
- ColoringManager manager =
language.getColoringManager();
- SemanticAnalyzer task =
language.getSemanticAnalyzer();
- if (manager != null && task != null) {
- Parser.Result r =
resultIterator.getParserResult();
- if (r instanceof ParserResult) {
- process(language, (ParserResult) r,
newColoring);
- }
- }
- }
-
- for(Embedding e : resultIterator.getEmbeddings()) {
- if (cancel.isCancelled()) {
- return;
- } else {
- run(resultIterator.getResultIterator(e));
- }
- }
- }
- });
+ ParserManager.parse(Collections.singleton(source),
(ResultIterator ri) -> processColorings(ri, newColoring));
} catch (ParseException e) {
LOG.log(Level.WARNING, null, e);
return;
@@ -133,139 +106,35 @@ public final class SemanticHighlighter extends
IndexingAwareParserResultTask<Par
}
final GsfSemanticLayer layer =
GsfSemanticLayer.getLayer(SemanticHighlighter.class, doc);
- SwingUtilities.invokeLater(new Runnable () {
- public void run() {
- // XXX: parsingapi
- layer.setColorings(newColoring, -1); //version
- }
+ SwingUtilities.invokeLater(() -> {
+ // XXX: parsingapi
+ layer.setColorings(newColoring);
});
} finally {
SpiSupportAccessor.getInstance().removeCancelSupport(cancel);
}
}
+ private void processColorings(ResultIterator resultIterator,
SortedSet<SequenceElement> newColoring) throws ParseException {
+ String mimeType = resultIterator.getSnapshot().getMimeType();
+ Language language =
LanguageRegistry.getInstance().getLanguageByMimeType(mimeType);
+ if (language != null) {
+ Parser.Result r = resultIterator.getParserResult();
+ if (r instanceof ParserResult pr) {
+ process(language, pr, newColoring);
+ }
+ }
- private void process(Language language, ParserResult result,
Set<SequenceElement> newColoring) throws ParseException {
-
- //final Map<OffsetRange, Coloring> oldColors =
GsfSemanticLayer.getLayer(SemanticHighlighter.class, doc).getColorings();
- //final Set<OffsetRange> removedTokens = new
HashSet<OffsetRange>(oldColors.keySet());
- //final Set<OffsetRange> addedTokens = new HashSet<OffsetRange>();
- //if (isCancelled()) {
- // return true;
- //}
-
-
-// XXX: parsingapi
-// EditHistory currentHistory = info.getHistory();
-// final int version = currentHistory.getVersion();
-//
-//
-// // Attempt to do less work in embedded scenarios: Only recompute
hints for regions
-// // that have changed
-// LanguageRegistry registry = LanguageRegistry.getInstance();
-// SortedSet<SequenceElement> colorings = layer.getColorings();
-// int previousVersion = layer.getVersion();
-//// XXX: parsingapi
-// if (mimeTypes.size() > 1 && colorings.size() > 0) { // &&
info.hasUnchangedResults()
-//
-// // Sort elements into buckets per language
-// Map<Language,List<SequenceElement>> elements = new
HashMap<Language,List<SequenceElement>>();
-// List<SequenceElement> prevList = null;
-// Language prevLanguage = null;
-// for (SequenceElement element : colorings) {
-// List<SequenceElement> list;
-// if (element.language == prevLanguage) {
-// list = prevList;
-// } else {
-// list = elements.get(element.language);
-// if (list == null) {
-// list = new ArrayList<SequenceElement>();
-// elements.put(element.language, list);
-// prevLanguage = element.language;
-// prevList = list;
-// }
-// }
-// list.add(element);
-// }
-//
-// // Recompute lists for languages that have changed
-// EditHistory history =
EditHistory.getCombinedEdits(previousVersion, currentHistory);
-// if (history != null) {
-// int offset = history.getStart();
-// for (String mimeType : mimeTypes) {
-// if (isCancelled()) {
-// return true;
-// }
-// Language language = registry.getLanguageByMimeType(mimeType);
-// if (language == null) {
-// continue;
-// }
-//
-// // Unchanged result?
-// ParserResult result = info.getEmbeddedResult(mimeType, 0);
-// if (result != null && result.getUpdateState().isUnchanged())
{
-//
-// // This section was not edited in the last parse tree,
-// // so just grab the previous elements, and use them
-// // (after tweaking the offsets)
-// List<SequenceElement> list = elements.get(language);
-//
-// if (list != null) {
-// for (SequenceElement element : list) {
-// if (element.language == language) {
-// OffsetRange range = element.range;
-// if (range.getStart() > offset) {
-// element.range = new
OffsetRange(history.convertOriginalToEdited(range.getStart()),
-//
history.convertOriginalToEdited(range.getEnd()));
-// }
-// newColoring.add(element);
-// }
-// }
-// }
-//
-// continue;
-// } else {
-// // We need to recompute the semantic highlights for this
language
-// ColoringManager manager = language.getColoringManager();
-// SemanticAnalyzer task = language.getSemanticAnalyzer();
-// if (task != null) {
-// // Allow language plugins to do their own analysis
too
-// try {
-// task.run(info);
-// } catch (Exception ex) {
-// ErrorManager.getDefault().notify(ex);
-// }
-//
-// if (isCancelled()) {
-// task.cancel();
-// return true;
-// }
-//
-// Map<OffsetRange,Set<ColoringAttributes>> highlights
= task.getHighlights();
-// if (highlights != null) {
-// for (OffsetRange range : highlights.keySet()) {
-//
-// Set<ColoringAttributes> colors =
highlights.get(range);
-// if (colors == null) {
-// continue;
-// }
-//
-// Coloring c = manager.getColoring(colors);
-//
-// //newColoring.put(range, c);
-// newColoring.add(new
SequenceElement(language, range, c));
-// }
-// }
-// }
-// }
-// }
-//
-// layer.setColorings(newColoring, version);
-// return true;
-// }
-// }
-
+ for(Embedding e : resultIterator.getEmbeddings()) {
+ if (cancel.isCancelled()) {
+ return;
+ } else {
+ processColorings(resultIterator.getResultIterator(e),
newColoring);
+ }
+ }
+ }
+ private void process(Language language, ParserResult result,
Set<SequenceElement> newColoring) throws ParseException {
if (cancel.isCancelled()) {
return;
}
@@ -290,26 +159,22 @@ public final class SemanticHighlighter extends
IndexingAwareParserResultTask<Par
}
Map<OffsetRange,Set<ColoringAttributes>> highlights =
task.getHighlights();
- if (highlights != null) {
- for (Map.Entry<OffsetRange, Set<ColoringAttributes>> entry :
highlights.entrySet()) {
+ for (Map.Entry<OffsetRange, Set<ColoringAttributes>> entry :
highlights.entrySet()) {
- OffsetRange range = entry.getKey();
- Set<ColoringAttributes> colors = entry.getValue();
- if (colors == null) {
- continue;
- }
+ OffsetRange range = entry.getKey();
+ Set<ColoringAttributes> colors = entry.getValue();
+ if (colors == null) {
+ continue;
+ }
- Coloring c = manager.getColoring(colors);
+ Coloring c = manager.getColoring(colors);
- newColoring.add(new SequenceElement(language, range, c));
+ newColoring.add(new SequenceElement(language, range, c));
- if (cancel.isCancelled()) {
- return;
- }
+ if (cancel.isCancelled()) {
+ return;
}
}
-
- return;
}
}
diff --git
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SequenceElement.java
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SequenceElement.java
index 2420ffe346..e839d39d5b 100644
---
a/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SequenceElement.java
+++
b/ide/csl.api/src/org/netbeans/modules/csl/editor/semantic/SequenceElement.java
@@ -26,78 +26,28 @@ import org.netbeans.modules.csl.api.OffsetRange;
/**
* Each SequeneceElement represents a OffsetRange/Coloring/Language tuple that
* is managed for semantic highlighting purposes. They are comparable since
they
- * are maintained in a TreeSet (sorted by the OffsetRanges). This sorted
treeset
- * is used to manage the various subsequences etc. needed by the highlight
sequences.
- * There is a special subclass of ElementSequence, ComparisonItem, which is
used
- * as comparison bounds (keys) passed into the TreeSet when generating
subsequences.
+ * are maintained in a TreeSet (sorted by the OffsetRanges).
*
* @author Tor Norbye
*/
-class SequenceElement implements Comparable<SequenceElement> {
- public final Language language;
- public OffsetRange range;
- public final Coloring coloring;
-
- private SequenceElement() {
- this(null, null, null);
- }
+record SequenceElement(Language language, OffsetRange range, Coloring
coloring) implements Comparable<SequenceElement> {
- public SequenceElement(Language language, OffsetRange range, Coloring
coloring) {
- this.language = language;
- this.range = range;
- this.coloring = coloring;
- }
-
+ @Override
public int compareTo(SequenceElement o) {
- if (o instanceof ComparisonItem) {
- return -1 * ((ComparisonItem) o).compareTo(this);
- } else {
- assert o.range != null;
- return range.compareTo(o.range);
- }
+ assert o.range() != null;
+ return range.compareTo(o.range());
}
@Override
public boolean equals(Object obj) {
- if (!(obj instanceof SequenceElement)) {
- return false;
+ if (obj instanceof SequenceElement other) {
+ return range.equals(other.range());
}
- SequenceElement other = (SequenceElement)obj;
-
- return range.equals(other.range);
+ return false;
}
@Override
public int hashCode() {
return range.hashCode();
}
-
- @Override
- public String toString() {
- return "SequenceElement(range=" + range + ", lang=" + language + ",
color=" + coloring + ")"; //NOI18N
- }
-
- // This class is used only for key comparison when creating subsets
- static class ComparisonItem extends SequenceElement {
- private int offset;
-
- ComparisonItem(int offset) {
- this.offset = offset;
- }
-
- @Override
- public int compareTo(SequenceElement o) {
- if (o instanceof ComparisonItem) {
- return offset - ((ComparisonItem)o).offset;
- } else {
- if (offset < o.range.getStart()) {
- return -1;
- } else if (offset >= o.range.getEnd()) { // forward biased
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
}
diff --git
a/ide/csl.api/test/unit/src/org/netbeans/modules/csl/editor/semantic/SequenceElementTest.java
b/ide/csl.api/test/unit/src/org/netbeans/modules/csl/editor/semantic/SequenceElementTest.java
deleted file mode 100644
index 62d2849b5e..0000000000
---
a/ide/csl.api/test/unit/src/org/netbeans/modules/csl/editor/semantic/SequenceElementTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.netbeans.modules.csl.editor.semantic;
-
-import junit.framework.TestCase;
-import org.netbeans.modules.csl.api.OffsetRange;
-
-/**
- *
- * @author Tor Norbye
- */
-public class SequenceElementTest extends TestCase {
-
- public SequenceElementTest(String testName) {
- super(testName);
- }
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- }
-
- public void testCompareTo() {
- SequenceElement s1 = new SequenceElement(null, new
OffsetRange(2,5),null);
- SequenceElement s2 = new SequenceElement(null, new
OffsetRange(5,7),null);
- assertTrue(s1.compareTo(s2) < 0);
- assertTrue(s2.compareTo(s1) > 0);
- s2 = new SequenceElement(null, new OffsetRange(2,5),null);
- assertTrue(s1.compareTo(s2) == 0);
- assertTrue(s2.compareTo(s1) == 0);
-
- s1 = new SequenceElement.ComparisonItem(1);
- s2 = new SequenceElement.ComparisonItem(2);
- assertTrue(s1.compareTo(s2) < 0);
- assertTrue(s2.compareTo(s1) > 0);
-
- // s1 below s2
- s2 = new SequenceElement(null, new OffsetRange(2,5),null);
- assertTrue(s1.compareTo(s2) < 0);
- assertTrue(s2.compareTo(s1) > 0);
-
- // s1 inside s2
- s1 = new SequenceElement.ComparisonItem(3);
- assertTrue(s1.compareTo(s2) == 0);
- assertTrue(s2.compareTo(s1) == 0);
-
- // s1 above s2
- s1 = new SequenceElement.ComparisonItem(6);
- assertTrue(s1.compareTo(s2) > 0);
- assertTrue(s2.compareTo(s1) < 0);
- }
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists