/* * Copyright 2015 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.rf.ide.core.testdata.text.read.recognizer; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; import org.rf.ide.core.testdata.model.FilePosition; import org.rf.ide.core.testdata.text.read.IRobotLineElement; import org.rf.ide.core.testdata.text.read.IRobotTokenType; import org.rf.ide.core.testdata.text.read.VersionAvailabilityInfo; public class RobotToken implements IRobotLineElement, Serializable { private static final long serialVersionUID = -7333635148571215189L; private FilePosition fp = new FilePosition(NOT_SET, NOT_SET, NOT_SET); private String raw = ""; private String text = ""; private final List<IRobotTokenType> types = new ArrayList<>(0); private boolean isDirty = false; private boolean wasFirstInit = false; public static RobotToken create(final String rawAndText) { return create(rawAndText, new ArrayList<IRobotTokenType>()); } public static RobotToken create(final String rawAndText, final Collection<? extends IRobotTokenType> types) { final RobotToken token = new RobotToken(); token.setRaw(rawAndText); token.setText(rawAndText); if (!types.isEmpty()) { token.getTypes().clear(); } token.getTypes().addAll(types); return token; } public RobotToken() { types.add(RobotTokenType.UNKNOWN); } @Override public int getLineNumber() { return fp.getLine(); } public void setLineNumber(final int lineNumber) { fp = new FilePosition(lineNumber, fp.getColumn(), fp.getOffset()); } @Override public int getStartColumn() { return fp.getColumn(); } public void setStartColumn(final int startColumn) { fp = new FilePosition(fp.getLine(), startColumn, fp.getOffset()); } @Override public int getEndColumn() { int endColumn = NOT_SET; if (fp.getColumn() != NOT_SET) { endColumn = fp.getColumn() + text.length(); } return endColumn; } public int getEndOffset() { return getStartOffset() + getEndColumn() - getStartColumn(); } public void setStartOffset(final int startOffset) { fp = new FilePosition(fp.getLine(), fp.getColumn(), startOffset); } @Override public int getStartOffset() { return fp.getOffset(); } @Override public String getText() { return text; } public void setText(final String text) { if (wasFirstInit) { if (!Objects.equals(this.text, text)) { markAsDirty(); } } wasFirstInit = true; this.text = (text != null) ? text.intern() : null; } private void markAsDirty() { isDirty = true; } public void clearDirtyFlag() { isDirty = false; } public boolean isNotEmpty() { return (this.getRaw() != null && !this.getRaw().isEmpty()) || (this.getText() != null && !this.getText().isEmpty()); } @Override public String getRaw() { return raw; } public void setRaw(final String raw) { this.raw = raw.intern(); } @Override public List<IRobotTokenType> getTypes() { return types; } public void setType(final IRobotTokenType type) { types.clear(); types.add(type); } @Override public String toString() { return String.format("RobotToken [filePosition=%s, text=%s, types=%s, isDirty=%s]", fp, text, types, isDirty); } @Override public FilePosition getFilePosition() { return fp; } @Override public boolean isDirty() { return isDirty; } public boolean isVariableDeclaration() { boolean result = false; for (final IRobotTokenType type : types) { if (type instanceof RobotTokenType) { final RobotTokenType robotType = (RobotTokenType) type; result = (robotType == RobotTokenType.VARIABLES_SCALAR_DECLARATION) || (robotType == RobotTokenType.VARIABLES_SCALAR_AS_LIST_DECLARATION) || (robotType == RobotTokenType.VARIABLES_LIST_DECLARATION) || (robotType == RobotTokenType.VARIABLES_DICTIONARY_DECLARATION); if (result) { break; } } } return result; } @Override public VersionAvailabilityInfo getVersionInformation() { VersionAvailabilityInfo vai = null; if (types != null && !types.isEmpty()) { vai = types.get(0).findVersionAvailablilityInfo(getRaw()); } return vai; } @Override public RobotToken copyWithoutPosition() { return copy(false); } @Override public RobotToken copy() { return copy(true); } private RobotToken copy(final boolean posInclude) { final RobotToken t = new RobotToken(); t.setText(getText()); t.setRaw(getRaw()); t.types.clear(); t.types.addAll(getTypes()); if (posInclude) { t.fp = this.fp.copy(); } else { t.fp = FilePosition.createNotSet(); } t.clearDirtyFlag(); return t; } @Override public final int hashCode() { return super.hashCode(); } @Override public final boolean equals(final Object obj) { return super.equals(obj); } }