blob: a69e28267d5e1900778429a67a4bff0e5d55e69d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.netbeans.modules.php.editor.indent;
/**
*
* @author Petr Pisl
*/
public class FormatToken {
public enum Kind {
TEXT,
ANCHOR,
ASSIGNMENT_ANCHOR,
UNBREAKABLE_SEQUENCE_START,
UNBREAKABLE_SEQUENCE_END,
OPEN_TAG,
CLOSE_TAG,
INIT_TAG, // special tag, that will contain some initional information
HTML,
INDENT,
WHITESPACE,
WHITESPACE_INDENT,
WHITESPACE_BEFORE_ELSE_WITHOUT_CURLY,
WHITESPACE_BEFORE_NAMESPACE,
WHITESPACE_AFTER_NAMESPACE,
WHITESPACE_BEFORE_USE,
WHITESPACE_BETWEEN_USE,
WHITESPACE_AFTER_USE,
WHITESPACE_BEFORE_CLASS_LEFT_BRACE,
WHITESPACE_BEFORE_ANONYMOUS_CLASS_LEFT_BRACE,
WHITESPACE_AROUND_OBJECT_OP,
WHITESPACE_AROUND_DECLARE_EQUAL,
WHITESPACE_AROUND_CONCAT_OP,
WHITESPACE_AROUND_UNARY_OP,
WHITESPACE_BEFORE_BINARY_OP,
WHITESPACE_AFTER_BINARY_OP,
WHITESPACE_AROUND_TERNARY_OP,
WHITESPACE_WITHIN_SHORT_TERNARY_OP,
WHITESPACE_BEFORE_ASSIGN_OP,
WHITESPACE_AFTER_ASSIGN_OP,
WHITESPACE_AROUND_KEY_VALUE_OP,
WHITESPACE_BEFORE_ANONYMOUS_CLASS_PAREN,
WHITESPACE_BEFORE_METHOD_DEC_PAREN,
WHITESPACE_BEFORE_METHOD_CALL_PAREN,
WHITESPACE_BEFORE_IF_PAREN,
WHITESPACE_BEFORE_FOR_PAREN,
WHITESPACE_BEFORE_WHILE_PAREN,
WHITESPACE_BEFORE_CATCH_PAREN,
WHITESPACE_BEFORE_SWITCH_PAREN,
WHITESPACE_BEFORE_ARRAY_DECL_PAREN,
WHITESPACE_AFTER_CLASS_LEFT_BRACE,
WHITESPACE_AFTER_ANONYMOUS_CLASS_LEFT_BRACE,
WHITESPACE_AFTER_KEYWORD,
WHITESPACE_BEFORE_FUNCTION_LEFT_BRACE,
WHITESPACE_BEFORE_IF_LEFT_BRACE,
WHITESPACE_BEFORE_ELSE_LEFT_BRACE,
WHITESPACE_BEFORE_FOR_LEFT_BRACE,
WHITESPACE_BEFORE_WHILE_LEFT_BRACE,
WHITESPACE_BEFORE_DO_LEFT_BRACE,
WHITESPACE_BEFORE_SWITCH_LEFT_BACE,
WHITESPACE_BEFORE_TRY_LEFT_BRACE,
WHITESPACE_BEFORE_CATCH_LEFT_BRACE,
WHITESPACE_BEFORE_FINALLY_LEFT_BRACE,
WHITESPACE_BEFORE_OTHER_LEFT_BRACE,
WHITESPACE_AFTER_OTHER_LEFT_BRACE,
WHITESPACE_BEFORE_CLASS_RIGHT_BRACE,
WHITESPACE_BEFORE_ANONYMOUS_CLASS_RIGHT_BRACE,
WHITESPACE_BEFORE_FUNCTION_RIGHT_BRACE,
WHITESPACE_BEFORE_IF_RIGHT_BRACE,
WHITESPACE_BEFORE_FOR_RIGHT_BRACE,
WHITESPACE_BEFORE_WHILE_RIGHT_BRACE,
WHITESPACE_BEFORE_SWITCH_RIGHT_BACE,
WHITESPACE_BEFORE_CATCH_RIGHT_BRACE,
WHITESPACE_BEFORE_OTHER_RIGHT_BRACE,
WHITESPACE_BEFORE_USES_PART,
WHITESPACE_BEFORE_USE_TRAIT,
WHITESPACE_BEFORE_USE_TRAIT_PART,
WHITESPACE_BEFORE_USE_TRAIT_BODY_LEFT_BRACE,
WHITESPACE_BEFORE_USE_TRAIT_BODY_RIGHT_BRACE,
WHITESPACE_BEFORE_GROUP_USE_LEFT_BRACE,
WHITESPACE_AFTER_GROUP_USE_LEFT_BRACE,
WHITESPACE_BEFORE_GROUP_USE_RIGHT_BRACE,
WHITESPACE_AFTER_ARRAY_DECL_LEFT_PAREN,
WHITESPACE_BEFORE_ARRAY_DECL_RIGHT_PAREN,
WHITESPACE_WITHIN_ANONYMOUS_CLASS_PARENS,
WHITESPACE_WITHIN_METHOD_DECL_PARENS,
WHITESPACE_WITHIN_METHOD_CALL_PARENS,
WHITESPACE_WITHIN_IF_PARENS,
WHITESPACE_WITHIN_FOR_PARENS,
WHITESPACE_WITHIN_WHILE_PARENS,
WHITESPACE_WITHIN_SWITCH_PARENS,
WHITESPACE_WITHIN_CATCH_PARENS,
WHITESPACE_WITHIN_ARRAY_BRACKETS_PARENS,
WHITESPACE_WITHIN_TYPE_CAST_PARENS,
WHITESPACE_BEFORE_COMMA,
WHITESPACE_AFTER_COMMA,
WHITESPACE_BEFORE_SEMI,
WHITESPACE_AFTER_SEMI,
WHITESPACE_AFTER_TYPE_CAST,
WHITESPACE_BEFORE_CLASS,
WHITESPACE_AFTER_CLASS,
WHITESPACE_AFTER_ANONYMOUS_CLASS,
WHITESPACE_BEFORE_FUNCTION,
WHITESPACE_AFTER_FUNCTION,
WHITESPACE_BEFORE_FIELDS,
WHITESPACE_BETWEEN_FIELDS,
WHITESPACE_AFTER_FIELDS,
WHITESPACE_BETWEEN_LINE_COMMENTS,
WHITESPACE_BETWEEN_OPEN_CLOSE_BRACES,
WHITESPACE_IN_ARGUMENT_LIST,
WHITESPACE_IN_ARRAY_ELEMENT_LIST,
WHITESPACE_IN_INTERFACE_LIST,
WHITESPACE_IN_PARAMETER_LIST,
WHITESPACE_IN_CHAINED_METHOD_CALLS,
WHITESPACE_IN_GROUP_USE_LIST,
WHITESPACE_BEFORE_OPEN_PHP_TAG,
WHITESPACE_AFTER_OPEN_PHP_TAG,
WHITESPACE_BEFORE_CLOSE_PHP_TAG,
WHITESPACE_AFTER_CLOSE_PHP_TAG,
WHITESPACE_BEFORE_EXTENDS_IMPLEMENTS,
WHITESPACE_BEFORE_FOR_STATEMENT,
WHITESPACE_BEFORE_WHILE_STATEMENT,
WHITESPACE_BEFORE_DO_STATEMENT,
WHITESPACE_BEFORE_IF_ELSE_STATEMENT,
WHITESPACE_IN_FOR,
WHITESPACE_IN_TERNARY_OP,
WHITESPACE_BEFORE_WHILE,
WHITESPACE_BEFORE_ELSE,
WHITESPACE_BEFORE_CATCH,
WHITESPACE_BEFORE_FINALLY,
WHITESPACE_AFTER_MODIFIERS,
WHITESPACE_BEFORE_RETURN_TYPE_SEPARATOR,
WHITESPACE_AFTER_RETURN_TYPE_SEPARATOR,
WHITESPACE_AFTER_NULLABLE_TYPE_PREFIX,
WHITESPACE_BEFORE_MULTI_CATCH_SEPARATOR,
WHITESPACE_AFTER_MULTI_CATCH_SEPARATOR,
LINE_COMMENT,
COMMENT,
COMMENT_START,
COMMENT_END,
DOC_COMMENT,
DOC_COMMENT_START,
DOC_COMMENT_END;
}
private int offset;
private Kind id;
private boolean whitespace;
private boolean breakable;
private String oldText;
public FormatToken(Kind id, int offset) {
this(id, offset, null);
}
public FormatToken(Kind id, int offset, String oldText) {
this.offset = offset;
this.id = id;
this.oldText = oldText;
this.whitespace = isWhitespace(id);
this.breakable = true;
}
public Kind getId() {
return id;
}
public int getOffset() {
return offset;
}
public boolean isBreakable() {
return breakable;
}
public String getOldText() {
return oldText;
}
public boolean isWhitespace() {
return whitespace;
}
private boolean isWhitespace(Kind kind) {
return kind != Kind.TEXT && kind != Kind.ANCHOR
&& kind != Kind.UNBREAKABLE_SEQUENCE_START
&& kind != Kind.UNBREAKABLE_SEQUENCE_END
&& kind != Kind.INDENT && kind != Kind.LINE_COMMENT
&& kind != Kind.COMMENT
&& kind != Kind.COMMENT_START
&& kind != Kind.COMMENT_END
&& kind != Kind.DOC_COMMENT
&& kind != Kind.DOC_COMMENT_START
&& kind != Kind.DOC_COMMENT_END
&& kind != Kind.OPEN_TAG
&& kind != Kind.CLOSE_TAG
&& kind != Kind.INIT_TAG
&& kind != Kind.HTML;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(id.name());
sb.append(" offset: ").append(offset);
if (oldText != null) {
sb.append(" lexerToken <").append(oldText.length()).append(">: ").append("'").append(oldText).append("'");
}
return sb.toString();
}
public static class IndentToken extends FormatToken {
private int delta;
public IndentToken(int offset, int delta) {
super(Kind.INDENT, offset, null);
this.delta = delta;
}
public int getDelta() {
return delta;
}
}
public static class AnchorToken extends FormatToken {
private int anchorColumn;
public AnchorToken(int offset) {
super(Kind.ANCHOR, offset);
anchorColumn = 0;
}
public int getAnchorColumn() {
return anchorColumn;
}
public void setAnchorColumn(int column) {
this.anchorColumn = column;
}
}
/**
* This class remember length of an identifier that is placed before = or =>
* to allow group alignment.
*/
public static class AssignmentAnchorToken extends FormatToken {
/**
* length of the identifier that is before the aligned operator
*/
private int length;
/**
* max length of an identifier in the group
*/
private int maxLength;
/**
* Indicates if this Token is in group with other AssignmentAnchorTokens
* or is alone.
*/
private boolean isInGroup;
/**
* Keeps previous instance in the group.
*/
private AssignmentAnchorToken previous;
private final boolean multilined;
public AssignmentAnchorToken(int offset, boolean multilined) {
super(Kind.ASSIGNMENT_ANCHOR, offset);
length = -1;
maxLength = -1;
previous = null;
isInGroup = false;
this.multilined = multilined;
}
public int getLenght() {
return length;
}
public void setLenght(int lenght) {
this.length = lenght;
}
public int getMaxLength() {
return maxLength;
}
public void setMaxLength(int maxLength) {
this.maxLength = maxLength;
}
public AssignmentAnchorToken getPrevious() {
return previous;
}
public void setPrevious(AssignmentAnchorToken previous) {
this.previous = previous;
}
public void setIsInGroup(boolean isInGroup) {
this.isInGroup = isInGroup;
}
public boolean isInGroup() {
return isInGroup;
}
public boolean isMultilined() {
return multilined;
}
}
public static class UnbreakableSequenceToken extends FormatToken {
private AnchorToken anchor;
public UnbreakableSequenceToken(int offset, AnchorToken anchor, Kind start) {
super(start, offset);
this.anchor = anchor;
}
public AnchorToken getAnchor() {
return anchor;
}
}
/**
* The first tag in the list that contains information for the processing
* list of formatting commants.
*/
public static class InitToken extends FormatToken {
boolean hasHTML;
public InitToken() {
super(Kind.INIT_TAG, 0);
hasHTML = false;
}
public boolean hasHTML() {
return hasHTML;
}
public void setHasHTML(boolean hasHTML) {
this.hasHTML = hasHTML;
}
}
}