blob: 12c8c492a7b41053dc4abc181116c6f89b5fc501 [file] [log] [blame]
/*
* Copyright 2000-2011 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 org.intellij.lang.xpath.xslt.context;
import com.intellij.openapi.util.Factory;
import com.intellij.openapi.util.Pair;
import com.intellij.util.containers.ContainerUtil;
import org.intellij.lang.xpath.context.ContextType;
import org.intellij.lang.xpath.context.functions.*;
import org.intellij.lang.xpath.psi.XPath2Type;
import javax.xml.namespace.QName;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import static org.intellij.lang.xpath.xslt.context.XsltFunctionContext.SAXON_7;
/*
* Created by IntelliJ IDEA.
* User: sweinreuter
* Date: 08.01.11
*/
public class Xslt2FunctionContext extends DefaultFunctionContext {
protected static final Map<Pair<QName, Integer>, Function> XSLT2_FUNCTIONS;
private static final Factory<FunctionContext> FACTORY = new Factory<FunctionContext>() {
@Override
public FunctionContext create() {
return new Xslt2FunctionContext();
}
};
protected Xslt2FunctionContext() {
super(Xslt2ContextProvider.TYPE);
}
static {
final Map<Pair<QName, Integer>, Function> decls = new HashMap<Pair<QName, Integer>, Function>();
// xslt 2.0
FunctionDeclarationParsing.addFunction(decls, "function-available($function-name as xs:string) as xs:boolean ");
FunctionDeclarationParsing.addFunction(decls, "function-available($function-name as xs:string, $arity as xs:integer) as xs:boolean");
FunctionDeclarationParsing.addFunction(decls, "type-available($type-name as xs:string) as xs:boolean ");
FunctionDeclarationParsing.addFunction(decls, "element-available($element-name as xs:string) as xs:boolean ");
FunctionDeclarationParsing.addFunction(decls, "current() as item() ");
FunctionDeclarationParsing.addFunction(decls, "current-group() as item()* ");
FunctionDeclarationParsing.addFunction(decls, "current-grouping-key() as xs:anyAtomicType? ");
FunctionDeclarationParsing.addFunction(decls, "regex-group($group-number as xs:integer) as xs:string ");
FunctionDeclarationParsing.addFunction(decls, "unparsed-entity-uri($entity-name as xs:string) as xs:anyURI ");
FunctionDeclarationParsing.addFunction(decls, "unparsed-entity-public-id($entity-name as xs:string) as xs:string ");
FunctionDeclarationParsing.addFunction(decls, "generate-id() as xs:string ");
FunctionDeclarationParsing.addFunction(decls, "generate-id($node as node()?) as xs:string ");
FunctionDeclarationParsing.addFunction(decls, "system-property($property-name as xs:string) as xs:string ");
FunctionDeclarationParsing.addFunction(decls, "document($uri-sequence as item()*) as node()*");
FunctionDeclarationParsing.addFunction(decls, "document($uri-sequence as item()*, $base-node as node()) as node()*");
FunctionDeclarationParsing.addFunction(decls, "unparsed-text($href as xs:string?) as xs:string?");
FunctionDeclarationParsing.addFunction(decls, "unparsed-text($href as xs:string?, $encoding as xs:string) as xs:string?");
FunctionDeclarationParsing.addFunction(decls, "unparsed-text-available($href as xs:string?) as xs:boolean");
FunctionDeclarationParsing.addFunction(decls, "unparsed-text-available($href as xs:string?, $encoding as xs:string?) as xs:boolean");
FunctionDeclarationParsing.addFunction(decls, "key($key-name as xs:string, $key-value as xs:anyAtomicType*) as node()* ");
FunctionDeclarationParsing.addFunction(decls, "key($key-name as xs:string, $key-value as xs:anyAtomicType*, $top as node()) as node()*");
FunctionDeclarationParsing.addFunction(decls, "format-number($value as numeric?, $picture as xs:string) as xs:string ");
FunctionDeclarationParsing.addFunction(decls, "format-number($value as numeric?, $picture as xs:string, $decimal-format-name as xs:string) as xs:string");
FunctionDeclarationParsing.addFunction(decls, "format-dateTime($value as xs:dateTime?, $picture as xs:string) as xs:string? ");
FunctionDeclarationParsing.addFunction(decls, "format-dateTime($value \t as xs:dateTime?,\n" +
"$picture as xs:string,\n" +
"$language as xs:string?,\n" +
"$calendar as xs:string?,\n" +
"$country as xs:string?) as xs:string?");
FunctionDeclarationParsing.addFunction(decls, "format-time($value as xs:time?, $picture as xs:string) as xs:string? ");
FunctionDeclarationParsing.addFunction(decls, "format-time($value \t as xs:time?,\n" +
"$picture as xs:string,\n" +
"$language as xs:string?,\n" +
"$calendar as xs:string?,\n" +
"$country as xs:string?) as xs:string?");
FunctionDeclarationParsing.addFunction(decls, "format-date($value as xs:date?, $picture as xs:string) as xs:string? ");
FunctionDeclarationParsing.addFunction(decls, "format-date($value \t as xs:date?,\n" +
"$picture as xs:string,\n" +
"$language as xs:string?,\n" +
"$calendar as xs:string?,\n" +
"$country as xs:string?) as xs:string?");
final Parameter optional_string = new Parameter(XPath2Type.STRING, Parameter.Kind.OPTIONAL);
final Parameter required_string = new Parameter(XPath2Type.STRING, Parameter.Kind.REQUIRED);
final Parameter required_nodeset = new Parameter(XPath2Type.NODE_SEQUENCE, Parameter.Kind.REQUIRED);
final Parameter required_any = new Parameter(XPath2Type.ITEM, Parameter.Kind.REQUIRED);
final Parameter optional_any = new Parameter(XPath2Type.ITEM, Parameter.Kind.OPTIONAL);
final Parameter any_list = new Parameter(XPath2Type.ITEM, Parameter.Kind.VARARG);
addFunction(decls, SAXON_7, new FunctionImpl("dayTimeDuration-from-seconds", XPath2Type.DAYTIMEDURATION, new Parameter(XPath2Type.INTEGER, Parameter.Kind.REQUIRED)));
addFunction(decls, SAXON_7, new FunctionImpl("yearMonthDuration-from-months", XPath2Type.YEARMONTHDURATION, new Parameter(XPath2Type.INTEGER, Parameter.Kind.REQUIRED)));
addFunction(decls, SAXON_7, new FunctionImpl("distinct", XPath2Type.NODE_SEQUENCE, required_nodeset, optional_any));
addFunction(decls, SAXON_7, new FunctionImpl("eval", XPath2Type.ITEM, required_any));
addFunction(decls, SAXON_7, new FunctionImpl("evaluate", XPath2Type.ITEM, required_string, any_list));
addFunction(decls, SAXON_7, new FunctionImpl("expression", XPath2Type.ITEM, required_string, any_list));
addFunction(decls, SAXON_7, new FunctionImpl("get-pseudo-attribute", XPath2Type.ITEM, required_string));
addFunction(decls, SAXON_7, new FunctionImpl("has-same-nodes", XPath2Type.BOOLEAN, required_nodeset, required_nodeset));
addFunction(decls, SAXON_7, new FunctionImpl("highest", XPath2Type.NODE_SEQUENCE, required_nodeset, optional_any));
addFunction(decls, SAXON_7, new FunctionImpl("leading", XPath2Type.NODE_SEQUENCE, required_nodeset, required_any));
addFunction(decls, SAXON_7, new FunctionImpl("line-number", XPath2Type.INTEGER));
addFunction(decls, SAXON_7, new FunctionImpl("max", XPath2Type.NUMERIC, required_nodeset, optional_any));
addFunction(decls, SAXON_7, new FunctionImpl("min", XPath2Type.NUMERIC, required_string));
addFunction(decls, SAXON_7, new FunctionImpl("parse", XPath2Type.NODE_SEQUENCE, required_nodeset, optional_any));
addFunction(decls, SAXON_7, new FunctionImpl("path", XPath2Type.STRING));
addFunction(decls, SAXON_7, new FunctionImpl("serialize", XPath2Type.STRING, required_nodeset, required_string));
addFunction(decls, SAXON_7, new FunctionImpl("sum", XPath2Type.NUMERIC, required_nodeset, optional_any));
addFunction(decls, SAXON_7, new FunctionImpl("systemId", XPath2Type.STRING));
addFunction(decls, SAXON_7, new FunctionImpl("tokenize", XPath2Type.NODE_SEQUENCE, required_string, optional_string));
XSLT2_FUNCTIONS = Collections.unmodifiableMap(decls);
}
@Override
protected Map<Pair<QName, Integer>, Function> createFunctionMap(ContextType contextType) {
return ContainerUtil.union(XSLT2_FUNCTIONS, super.createFunctionMap(contextType));
}
@Override
public boolean allowsExtensions() {
return true;
}
@Override
public Function resolve(QName name, int argCount) {
if (name.getNamespaceURI().length() == 0) {
name = new QName(FunctionDeclarationParsing.FUNCTION_NAMESPACE, name.getLocalPart());
}
return super.resolve(name, argCount);
}
public static FunctionContext getInstance() {
return getInstance(Xslt2ContextProvider.TYPE, FACTORY);
}
public static void main(String[] args) {
}
}