blob: b7447c20adbb4e94814f86b108eda7cdd5544045 [file] [log] [blame]
/*
* Copyright 2005 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.lang.xpath.xslt.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.xml.XmlChildRole;
import com.intellij.psi.xml.XmlTag;
import org.intellij.lang.xpath.xslt.XsltSupport;
import org.intellij.lang.xpath.xslt.psi.XsltElement;
import org.intellij.lang.xpath.xslt.psi.XsltElementFactory;
import org.jetbrains.annotations.Nullable;
class XsltElementFactoryImpl extends XsltElementFactory {
private static final Key<Pair<ASTNode, XsltElement>> WRAPPER = Key.create("WRAPPER");
@SuppressWarnings({ "unchecked" })
public XsltElement wrapElement(XmlTag target) {
return wrapElement(target, XsltElement.class);
}
@Override
public <T extends XsltElement> T wrapElement(XmlTag target, Class<T> clazz) {
assert target.isValid();
final Pair<ASTNode, XsltElement> wrapper = target.getUserData(WRAPPER);
final ASTNode tagNode = target.getNode();
final ASTNode nameNode = tagNode != null ? XmlChildRole.START_TAG_NAME_FINDER.findChild(tagNode) : null;
if (wrapper != null) {
if (wrapper.getFirst() == nameNode) {
if (wrapper.second.isValid() && clazz.isAssignableFrom(wrapper.second.getClass())) {
return clazz.cast(wrapper.second);
}
}
}
assert XsltSupport.isXsltTag(target) : "Not an XSLT tag: {" + target.getNamespace() + "}" + target.getName();
final XsltElement element;
if (XsltSupport.isTemplate(target, false)) {
element = new XsltTemplateImpl(target);
} else if (XsltSupport.isVariable(target)) {
element = new XsltVariableImpl(target);
} else if (XsltSupport.isParam(target)) {
element = new XsltParameterImpl(target);
} else if (XsltSupport.isTemplateCall(target)) {
element = new XsltCallTemplateImpl(target);
} else if (XsltSupport.isApplyTemplates(target)) {
element = new XsltApplyTemplatesImpl(target);
} else if ("with-param".equals(target.getLocalName())) {
element = new XsltWithParamImpl(target);
} else if (XsltSupport.isXsltRootTag(target)) {
element = new XsltStylesheetImpl(target);
} else if (XsltSupport.isFunction(target)) {
element = new XsltFunctionImpl(target);
} else {
element = new DummyElementImpl(target);
}
if (!(element instanceof DummyElementImpl)) {
target.putUserData(WRAPPER, Pair.create(nameNode, element));
}
return clazz.cast(element);
}
private static class DummyElementImpl extends XsltElementImpl {
public DummyElementImpl(XmlTag target) {
super(target);
}
@Nullable
public String toString() {
return "Unrecognized tag: " + getTag().getName();
}
}
}