/* * Copyright 2007 Sascha Weinreuter * * 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 org.intellij.plugins.relaxNG.compact.psi.impl; import com.intellij.extapi.psi.PsiFileBase; import com.intellij.lang.ASTNode; import com.intellij.openapi.fileTypes.FileType; import com.intellij.psi.FileViewProvider; import com.intellij.psi.PsiElement; import com.intellij.psi.ResolveState; import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.ProjectScope; import com.intellij.psi.search.PsiElementProcessor; import com.intellij.psi.tree.TokenSet; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlFile; import com.intellij.psi.xml.XmlTag; import com.intellij.util.IncorrectOperationException; import org.intellij.plugins.relaxNG.compact.RncElementTypes; import org.intellij.plugins.relaxNG.compact.RncFileType; import org.intellij.plugins.relaxNG.compact.RngCompactLanguage; import org.intellij.plugins.relaxNG.compact.psi.RncDecl; import org.intellij.plugins.relaxNG.compact.psi.RncFile; import org.intellij.plugins.relaxNG.compact.psi.RncGrammar; import org.jetbrains.annotations.NotNull; public class RncFileImpl extends PsiFileBase implements RncFile, XmlFile { private static final TokenSet DECLS = TokenSet.create(RncElementTypes.NS_DECL, RncElementTypes.DATATYPES_DECL); public RncFileImpl(FileViewProvider viewProvider) { super(viewProvider, RngCompactLanguage.INSTANCE); } @Override @NotNull public FileType getFileType() { return RncFileType.getInstance(); } @Override @NotNull public XmlDocument getDocument() { // this needs to be a seperate child element because of com.intellij.util.xml.impl.ExternalChangeProcessor.visitDocumentChanged() final XmlDocument document = findChildByClass(XmlDocument.class); assert document != null; return document; } @Override public XmlTag getRootTag() { return getDocument().getRootTag(); } @Override public boolean processDeclarations(@NotNull PsiScopeProcessor processor, @NotNull ResolveState substitutor, PsiElement lastParent, @NotNull PsiElement place) { //processor.handleEvent(JavaScopeProcessorEvent.SET_CURRENT_FILE_CONTEXT, this); try { final ASTNode docNode = getDocument().getNode(); assert docNode != null; final ASTNode[] nodes = docNode.getChildren(DECLS); for (ASTNode node : nodes) { if (!processor.execute(node.getPsi(), substitutor)) { return false; } } final RncGrammar grammar = getGrammar(); if (grammar != null) { return grammar.processDeclarations(processor, substitutor, lastParent, place); } else { return true; } } finally { //processor.handleEvent(JavaScopeProcessorEvent.SET_CURRENT_FILE_CONTEXT, null); } } @Override public PsiElement add(@NotNull PsiElement element) throws IncorrectOperationException { return getDocument().add(element); } @Override public PsiElement addAfter(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { return getDocument().addAfter(element, anchor); } @Override public PsiElement addBefore(@NotNull PsiElement element, PsiElement anchor) throws IncorrectOperationException { return getDocument().addBefore(element, anchor); } @Override public boolean processElements(PsiElementProcessor processor, PsiElement place) { return false; } @NotNull @Override public GlobalSearchScope getFileResolveScope() { return ProjectScope.getAllScope(getProject()); } @Override public boolean ignoreReferencedElementAccessibility() { return false; } @Override public String toString() { return getClass().getSimpleName() + ":" + getName(); } @Override public RncDecl[] getDeclarations() { return ((RncDocument)getDocument()).findChildrenByClass(RncDecl.class); } @Override public RncGrammar getGrammar() { final XmlDocument document = getDocument(); return ((RncDocument)document).getGrammar(); } }