1
package com.thaiopensource.relaxng.pattern;
3
class DataDerivTypeFunction extends AbstractPatternFunction<DataDerivType> {
4
private final ValidatorPatternBuilder builder;
6
DataDerivTypeFunction(ValidatorPatternBuilder builder) {
7
this.builder = builder;
10
static DataDerivType dataDerivType(ValidatorPatternBuilder builder, Pattern pattern) {
11
return pattern.apply(builder.getDataDerivTypeFunction());
14
public DataDerivType caseOther(Pattern p) {
15
return new SingleDataDerivType();
18
public DataDerivType caseRef(RefPattern p) {
19
return apply(p.getPattern());
22
public DataDerivType caseAfter(AfterPattern p) {
23
Pattern p1 = p.getOperand1();
24
DataDerivType ddt = apply(p.getOperand1());
27
return ddt.combine(new BlankDataDerivType());
30
private DataDerivType caseBinary(BinaryPattern p) {
31
return apply(p.getOperand1()).combine(apply(p.getOperand2()));
34
public DataDerivType caseChoice(ChoicePattern p) {
38
public DataDerivType caseGroup(GroupPattern p) {
42
public DataDerivType caseInterleave(InterleavePattern p) {
46
public DataDerivType caseOneOrMore(OneOrMorePattern p) {
47
return apply(p.getOperand());
50
public DataDerivType caseList(ListPattern p) {
51
return InconsistentDataDerivType.getInstance();
54
public DataDerivType caseValue(ValuePattern p) {
55
return new ValueDataDerivType(p.getDatatype(), p.getDatatypeName());
58
public DataDerivType caseData(DataPattern p) {
59
if (p.allowsAnyString())
60
return new SingleDataDerivType();
61
return new DataDataDerivType(p);
64
public DataDerivType caseDataExcept(DataExceptPattern p) {
65
if (p.allowsAnyString())
66
return apply(p.getExcept());
67
return new DataDataDerivType(p).combine(apply(p.getExcept()));
70
private DataDerivType apply(Pattern p) {
71
return builder.getPatternMemo(p).dataDerivType();