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

Reply via email to