diff options
Diffstat (limited to 'javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmConditional.java')
-rw-r--r-- | javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmConditional.java | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmConditional.java b/javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmConditional.java new file mode 100644 index 000000000..a2ca7cdd1 --- /dev/null +++ b/javaparser-core/src/main/java/com/github/javaparser/printer/concretesyntaxmodel/CsmConditional.java @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2007-2010 JĂșlio Vilmar Gesser. + * Copyright (C) 2011, 2013-2016 The JavaParser Team. + * + * This file is part of JavaParser. + * + * JavaParser can be used either under the terms of + * a) the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * b) the terms of the Apache License + * + * You should have received a copy of both licenses in LICENCE.LGPL and + * LICENCE.APACHE. Please refer to those files for details. + * + * JavaParser is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + */ + +package com.github.javaparser.printer.concretesyntaxmodel; + +import com.github.javaparser.ast.Node; +import com.github.javaparser.ast.NodeList; +import com.github.javaparser.ast.observer.ObservableProperty; +import com.github.javaparser.printer.SourcePrinter; + +import java.util.Arrays; +import java.util.List; + +public class CsmConditional implements CsmElement { + private final Condition condition; + private final List<ObservableProperty> properties; + private final CsmElement thenElement; + private final CsmElement elseElement; + + public Condition getCondition() { + return condition; + } + + public ObservableProperty getProperty() { + if (properties.size() > 1) { + throw new IllegalStateException(); + } + return properties.get(0); + } + + public CsmElement getThenElement() { + return thenElement; + } + + public CsmElement getElseElement() { + return elseElement; + } + + public enum Condition { + IS_EMPTY, + IS_NOT_EMPTY, + IS_PRESENT, + FLAG; + + boolean evaluate(Node node, ObservableProperty property){ + if (this == IS_PRESENT) { + return !property.isNullOrNotPresent(node); + } + if (this == FLAG) { + return property.getValueAsBooleanAttribute(node); + } + if (this == IS_EMPTY) { + NodeList value = property.getValueAsMultipleReference(node); + return value == null || value.isEmpty(); + } + if (this == IS_NOT_EMPTY) { + NodeList value = property.getValueAsMultipleReference(node); + return value != null && !value.isEmpty(); + } + throw new UnsupportedOperationException(name()); + } + } + + public CsmConditional(ObservableProperty property, Condition condition, CsmElement thenElement, CsmElement elseElement) { + this.properties = Arrays.asList(property); + this.condition = condition; + this.thenElement = thenElement; + this.elseElement = elseElement; + } + + public CsmConditional(List<ObservableProperty> properties, Condition condition, CsmElement thenElement, CsmElement elseElement) { + if (properties.size() < 1) { + throw new IllegalArgumentException(); + } + this.properties = properties; + this.condition = condition; + this.thenElement = thenElement; + this.elseElement = elseElement; + } + + public CsmConditional(ObservableProperty property, Condition condition, CsmElement thenElement) { + this(property, condition, thenElement, new CsmNone()); + } + + @Override + public void prettyPrint(Node node, SourcePrinter printer) { + boolean test = false; + for (ObservableProperty prop : properties) { + test = test || condition.evaluate(node, prop); + } + if (test) { + thenElement.prettyPrint(node, printer); + } else { + elseElement.prettyPrint(node, printer); + } + } +} |