blob: 69af95c83476c01acd75bf45e274568c3e9681a0 [file] [log] [blame]
/*
* 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.languages.yaml;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.netbeans.modules.csl.api.ColoringAttributes;
import org.netbeans.modules.csl.api.OffsetRange;
import org.netbeans.modules.csl.api.SemanticAnalyzer;
import org.netbeans.modules.csl.api.StructureItem;
import org.netbeans.modules.parsing.spi.Parser.Result;
import org.netbeans.modules.parsing.spi.Scheduler;
import org.netbeans.modules.parsing.spi.SchedulerEvent;
/**
* Semantic Analyzer for YAML
*
* @author Tor Norbye
*/
public class YamlSemanticAnalyzer extends SemanticAnalyzer {
private boolean cancelled;
private Map<OffsetRange, Set<ColoringAttributes>> semanticHighlights;
@Override
public Map<OffsetRange, Set<ColoringAttributes>> getHighlights() {
return semanticHighlights;
}
protected final synchronized boolean isCancelled() {
return cancelled;
}
protected final synchronized void resume() {
cancelled = false;
}
@Override
public void cancel() {
cancelled = true;
}
@Override
public int getPriority() {
return 0;
}
@Override
public Class<? extends Scheduler> getSchedulerClass() {
return Scheduler.EDITOR_SENSITIVE_TASK_SCHEDULER;
}
@Override
public void run(Result result, SchedulerEvent event) {
resume();
if (isCancelled()) {
return;
}
YamlParserResult ypr = (YamlParserResult) result;
if (ypr == null || ypr.getItems().isEmpty()) {
this.semanticHighlights = Collections.emptyMap();
return;
}
Map<OffsetRange, Set<ColoringAttributes>> highlights =
new HashMap<OffsetRange, Set<ColoringAttributes>>(100);
for (StructureItem item : ypr.getItems()) {
YamlStructureItem yamlItem = (YamlStructureItem) item;
addHighlights(yamlItem, highlights);
}
this.semanticHighlights = highlights;
}
private void addHighlights(YamlStructureItem item, Map<OffsetRange, Set<ColoringAttributes>> highlights) {
switch (item.getType()) {
case MAP:
case SEQUENCE:
YamlStructureItem.Collection coll = (YamlStructureItem.Collection) item;
for (YamlStructureItem child : coll.getChildren()) {
addHighlights(child, highlights);
}
break;
case MAPPING:
YamlStructureItem.MapEntry entry = (YamlStructureItem.MapEntry) item;
if (entry.keyItem.getType() == YamlStructureItem.NodeType.SCALAR) {
highlights.put(getAstRange(entry.keyItem), ColoringAttributes.METHOD_SET);
} else {
addHighlights(entry.keyItem, highlights);
}
addHighlights(entry.valueItem, highlights);
break;
}
}
private static OffsetRange getAstRange(YamlStructureItem item) {
int s = (int) item.getPosition();
int e = (int) item.getEndPosition();
return new OffsetRange(s, e);
}
}