| package com.intellij.lang.properties.psi.impl; |
| |
| import com.intellij.openapi.diagnostic.Logger; |
| import com.intellij.openapi.util.TextRange; |
| import com.intellij.psi.LiteralTextEscaper; |
| import org.jetbrains.annotations.NotNull; |
| |
| /** |
| * @author gregsh |
| */ |
| public class PropertyImplEscaper extends LiteralTextEscaper<PropertyImpl> { |
| private static final Logger LOG = Logger.getInstance(PropertyImplEscaper.class); |
| |
| private int[] outSourceOffsets; |
| |
| public PropertyImplEscaper(PropertyImpl value) { |
| super(value); |
| } |
| |
| @Override |
| public boolean decode(@NotNull TextRange rangeInsideHost, @NotNull StringBuilder outChars) { |
| TextRange.assertProperRange(rangeInsideHost); |
| String subText = rangeInsideHost.substring(myHost.getText()); |
| outSourceOffsets = new int[subText.length() + 1]; |
| int prefixLen = outChars.length(); |
| boolean b = PropertyImpl.parseCharacters(subText, outChars, outSourceOffsets); |
| if (b) { |
| for (int i = prefixLen, len = outChars.length(); i < len; i++) { |
| char outChar = outChars.charAt(i); |
| char inChar = subText.charAt(outSourceOffsets[i - prefixLen]); |
| if (outChar != inChar && inChar != '\\') { |
| LOG.error("input: " + subText + ";\noutput: " + outChars + |
| "\nat: " + i + "; prefix-length: " + prefixLen); |
| } |
| } |
| } |
| return b; |
| } |
| |
| @Override |
| public int getOffsetInHost(int offsetInDecoded, @NotNull TextRange rangeInsideHost) { |
| int result = offsetInDecoded < outSourceOffsets.length ? outSourceOffsets[offsetInDecoded] : -1; |
| if (result == -1) return -1; |
| return (result <= rangeInsideHost.getLength() ? result : rangeInsideHost.getLength()) + rangeInsideHost.getStartOffset(); |
| } |
| |
| @Override |
| public boolean isOneLine() { |
| return !myHost.getText().contains("\\"); |
| } |
| } |