| /* |
| * Copyright 2000-2009 JetBrains s.r.o. |
| * |
| * Licensed 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 com.intellij.codeInsight.highlighting; |
| |
| import com.intellij.lang.BracePair; |
| import com.intellij.lang.Language; |
| import com.intellij.lang.PairedBraceMatcher; |
| import com.intellij.openapi.editor.highlighter.HighlighterIterator; |
| import com.intellij.openapi.fileTypes.FileType; |
| import com.intellij.psi.PsiFile; |
| import com.intellij.psi.tree.IElementType; |
| import org.jetbrains.annotations.NotNull; |
| import org.jetbrains.annotations.Nullable; |
| |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| |
| public class PairedBraceMatcherAdapter implements NontrivialBraceMatcher { |
| private final PairedBraceMatcher myMatcher; |
| private final Language myLanguage; |
| |
| public PairedBraceMatcherAdapter(final PairedBraceMatcher matcher, Language language) { |
| myMatcher = matcher; |
| myLanguage = language; |
| } |
| |
| @Override |
| public int getBraceTokenGroupId(IElementType tokenType) { |
| final BracePair[] pairs = myMatcher.getPairs(); |
| for (BracePair pair : pairs) { |
| if (tokenType == pair.getLeftBraceType() || tokenType == pair.getRightBraceType()) return myLanguage.hashCode(); |
| } |
| return -1; |
| } |
| |
| @Nullable |
| public BracePair findPair(boolean left, HighlighterIterator iterator, CharSequence fileText, FileType fileType) { |
| final IElementType tokenType = iterator.getTokenType(); |
| final BracePair[] pairs = myMatcher.getPairs(); |
| for (BracePair pair : pairs) { |
| if (tokenType == (left ? pair.getLeftBraceType() : pair.getRightBraceType())) return pair; |
| } |
| return null; |
| } |
| |
| @Override |
| public boolean isLBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) { |
| return findPair(true, iterator, fileText, fileType) != null; |
| } |
| |
| @Override |
| public boolean isRBraceToken(HighlighterIterator iterator, CharSequence fileText, FileType fileType) { |
| return findPair(false, iterator, fileText, fileType) != null; |
| } |
| |
| @Override |
| public IElementType getOppositeBraceTokenType(@NotNull final IElementType type) { |
| final BracePair[] pairs = myMatcher.getPairs(); |
| for (BracePair pair : pairs) { |
| if (type == pair.getRightBraceType()) return pair.getLeftBraceType(); |
| if (type == pair.getLeftBraceType()) return pair.getRightBraceType(); |
| } |
| |
| return null; |
| } |
| |
| @Override |
| public boolean isPairBraces(IElementType tokenType, IElementType tokenType2) { |
| final BracePair[] pairs = myMatcher.getPairs(); |
| for (BracePair pair : pairs) { |
| if (tokenType == pair.getLeftBraceType() && tokenType2 == pair.getRightBraceType() || |
| tokenType == pair.getRightBraceType() && tokenType2 == pair.getLeftBraceType()) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| @Override |
| public boolean isStructuralBrace(HighlighterIterator iterator, CharSequence text, FileType fileType) { |
| final IElementType tokenType = iterator.getTokenType(); |
| final BracePair[] pairs = myMatcher.getPairs(); |
| for (BracePair pair : pairs) { |
| if (tokenType == pair.getRightBraceType() || tokenType == pair.getLeftBraceType()) return pair.isStructural(); |
| } |
| return false; |
| } |
| |
| @Override |
| public boolean isPairedBracesAllowedBeforeType(@NotNull IElementType lbraceType, @Nullable IElementType contextType) { |
| return myMatcher.isPairedBracesAllowedBeforeType(lbraceType, contextType); |
| } |
| |
| @Override |
| public int getCodeConstructStart(final PsiFile file, int openingBraceOffset) { |
| return myMatcher.getCodeConstructStart(file, openingBraceOffset); |
| } |
| |
| @Override |
| @NotNull |
| public List<IElementType> getOppositeBraceTokenTypes(@NotNull IElementType type) { |
| List<IElementType> result = null; |
| |
| for (BracePair pair : myMatcher.getPairs()) { |
| IElementType match = null; |
| |
| if (type == pair.getRightBraceType()) match = pair.getLeftBraceType(); |
| if (type == pair.getLeftBraceType()) match = pair.getRightBraceType(); |
| |
| if (match != null) { |
| if (result == null) result = new ArrayList<IElementType>(2); |
| result.add(match); |
| } |
| } |
| |
| return result != null ? result : Collections.<IElementType>emptyList(); |
| } |
| |
| @Override |
| public boolean shouldStopMatch(boolean forward, @NotNull IElementType braceType, @NotNull HighlighterIterator iterator) { |
| if (myMatcher instanceof BraceMatcherTerminationAspect) { |
| return ((BraceMatcherTerminationAspect)myMatcher).shouldStopMatch(forward, braceType, iterator); |
| } |
| return false; |
| } |
| } |