From 76c47f441831ec5f629071f04b3a72637d4df777 Mon Sep 17 00:00:00 2001 From: Pavel Vojtechovsky Date: Tue, 26 Jun 2018 21:49:25 +0200 Subject: [PATCH] feat(position): CompoundSourcePosition extends SourcePosition --- .../cu/position/CompoundSourcePosition.java | 30 ++++++++ .../position/DeclarationSourcePosition.java | 8 +- .../spoon/reflect/factory/CoreFactory.java | 10 +++ .../spoon/support/DefaultCoreFactory.java | 7 ++ .../position/CompoundSourcePositionImpl.java | 76 +++++++++++++++++++ .../DeclarationSourcePositionImpl.java | 34 +-------- 6 files changed, 127 insertions(+), 38 deletions(-) create mode 100644 src/main/java/spoon/reflect/cu/position/CompoundSourcePosition.java create mode 100644 src/main/java/spoon/support/reflect/cu/position/CompoundSourcePositionImpl.java diff --git a/src/main/java/spoon/reflect/cu/position/CompoundSourcePosition.java b/src/main/java/spoon/reflect/cu/position/CompoundSourcePosition.java new file mode 100644 index 00000000000..b29c587ba0b --- /dev/null +++ b/src/main/java/spoon/reflect/cu/position/CompoundSourcePosition.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program 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 CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.reflect.cu.position; + +import spoon.reflect.cu.SourcePosition; + +/** + * This interface represents the position of a program element in a source file. + */ +public interface CompoundSourcePosition extends SourcePosition { + + int getNameStart(); + + int getNameEnd(); + +} diff --git a/src/main/java/spoon/reflect/cu/position/DeclarationSourcePosition.java b/src/main/java/spoon/reflect/cu/position/DeclarationSourcePosition.java index 8124d3a48cd..f57f4631914 100644 --- a/src/main/java/spoon/reflect/cu/position/DeclarationSourcePosition.java +++ b/src/main/java/spoon/reflect/cu/position/DeclarationSourcePosition.java @@ -16,19 +16,13 @@ */ package spoon.reflect.cu.position; -import spoon.reflect.cu.SourcePosition; - /** * This interface represents the position of a program element in a source file. */ -public interface DeclarationSourcePosition extends SourcePosition { +public interface DeclarationSourcePosition extends CompoundSourcePosition { int getModifierSourceStart(); int getModifierSourceEnd(); - int getNameStart(); - - int getNameEnd(); - } diff --git a/src/main/java/spoon/reflect/factory/CoreFactory.java b/src/main/java/spoon/reflect/factory/CoreFactory.java index 11bb7f3b9c7..b445de5a047 100644 --- a/src/main/java/spoon/reflect/factory/CoreFactory.java +++ b/src/main/java/spoon/reflect/factory/CoreFactory.java @@ -67,6 +67,7 @@ import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.position.BodyHolderSourcePosition; +import spoon.reflect.cu.position.CompoundSourcePosition; import spoon.reflect.cu.position.DeclarationSourcePosition; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtAnnotationMethod; @@ -403,6 +404,15 @@ SourcePosition createSourcePosition( /** Creates a source position that points to the given compilation unit */ SourcePosition createPartialSourcePosition(CompilationUnit compilationUnit); + /** + * Creates a compound source position. + */ + CompoundSourcePosition createCompoundSourcePosition( + CompilationUnit compilationUnit, + int startSource, int end, + int declarationStart, int declarationEnd, + int[] lineSeparatorPositions); + /** * Creates a declaration source position. */ diff --git a/src/main/java/spoon/support/DefaultCoreFactory.java b/src/main/java/spoon/support/DefaultCoreFactory.java index 9071729f8a7..5f235e8e9bd 100644 --- a/src/main/java/spoon/support/DefaultCoreFactory.java +++ b/src/main/java/spoon/support/DefaultCoreFactory.java @@ -67,6 +67,7 @@ import spoon.reflect.cu.CompilationUnit; import spoon.reflect.cu.SourcePosition; import spoon.reflect.cu.position.BodyHolderSourcePosition; +import spoon.reflect.cu.position.CompoundSourcePosition; import spoon.reflect.cu.position.DeclarationSourcePosition; import spoon.reflect.declaration.CtAnnotation; import spoon.reflect.declaration.CtAnnotationMethod; @@ -154,6 +155,7 @@ import spoon.support.reflect.code.CtWhileImpl; import spoon.support.reflect.cu.CompilationUnitImpl; import spoon.support.reflect.cu.position.BodyHolderSourcePositionImpl; +import spoon.support.reflect.cu.position.CompoundSourcePositionImpl; import spoon.support.reflect.cu.position.DeclarationSourcePositionImpl; import spoon.support.reflect.cu.position.SourcePositionImpl; import spoon.support.reflect.declaration.CtAnnotationImpl; @@ -697,6 +699,11 @@ public SourcePosition createPartialSourcePosition(CompilationUnit compilationUni return ((CompilationUnitImpl) compilationUnit).getOrCreatePartialSourcePosition(); } + @Override + public CompoundSourcePosition createCompoundSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int declarationStart, int declarationEnd, int[] lineSeparatorPositions) { + return new CompoundSourcePositionImpl(compilationUnit, startSource, end, declarationStart, declarationEnd, lineSeparatorPositions); + } + @Override public DeclarationSourcePosition createDeclarationSourcePosition(CompilationUnit compilationUnit, int startSource, int end, int modifierStart, int modifierEnd, int declarationStart, int declarationEnd, int[] lineSeparatorPositions) { return new DeclarationSourcePositionImpl(compilationUnit, startSource, end, modifierStart, modifierEnd, declarationStart, declarationEnd, lineSeparatorPositions); diff --git a/src/main/java/spoon/support/reflect/cu/position/CompoundSourcePositionImpl.java b/src/main/java/spoon/support/reflect/cu/position/CompoundSourcePositionImpl.java new file mode 100644 index 00000000000..65abd0e5c58 --- /dev/null +++ b/src/main/java/spoon/support/reflect/cu/position/CompoundSourcePositionImpl.java @@ -0,0 +1,76 @@ +/** + * Copyright (C) 2006-2018 INRIA and contributors + * Spoon - http://spoon.gforge.inria.fr/ + * + * This software is governed by the CeCILL-C License under French law and + * abiding by the rules of distribution of free software. You can use, modify + * and/or redistribute the software under the terms of the CeCILL-C license as + * circulated by CEA, CNRS and INRIA at http://www.cecill.info. + * + * This program 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 CeCILL-C License for more details. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL-C license and that you accept its terms. + */ +package spoon.support.reflect.cu.position; + +import spoon.reflect.cu.CompilationUnit; +import spoon.reflect.cu.position.CompoundSourcePosition; + +import java.io.Serializable; + +/** + * This class represents the position of a Java program element in a source + * file. + */ +public class CompoundSourcePositionImpl extends SourcePositionImpl + implements CompoundSourcePosition, Serializable { + + private static final long serialVersionUID = 1L; + private int declarationSourceStart; + private int declarationSourceEnd; + + public CompoundSourcePositionImpl(CompilationUnit compilationUnit, int sourceStart, int sourceEnd, + int declarationSourceStart, int declarationSourceEnd, + int[] lineSeparatorPositions) { + super(compilationUnit, + sourceStart, sourceEnd, + lineSeparatorPositions); + checkArgsAreAscending(declarationSourceStart, sourceStart, sourceEnd + 1, declarationSourceEnd + 1); + this.declarationSourceStart = declarationSourceStart; + this.declarationSourceEnd = declarationSourceEnd; + } + + @Override + public int getSourceEnd() { + return declarationSourceEnd; + } + + @Override + public int getSourceStart() { + return declarationSourceStart; + } + + @Override + public int getNameStart() { + return super.getSourceStart(); + } + + @Override + public int getNameEnd() { + return super.getSourceEnd(); + } + + public int getEndLine() { + return searchLineNumber(declarationSourceEnd); + } + + @Override + public String getSourceDetails() { + return super.getSourceDetails() + + "\nname = " + getFragment(getNameStart(), getNameEnd()); + } + +} diff --git a/src/main/java/spoon/support/reflect/cu/position/DeclarationSourcePositionImpl.java b/src/main/java/spoon/support/reflect/cu/position/DeclarationSourcePositionImpl.java index b5b6743f88e..a3f322cca71 100644 --- a/src/main/java/spoon/support/reflect/cu/position/DeclarationSourcePositionImpl.java +++ b/src/main/java/spoon/support/reflect/cu/position/DeclarationSourcePositionImpl.java @@ -25,56 +25,32 @@ * This class represents the position of a Java program element in a source * file. */ -public class DeclarationSourcePositionImpl extends SourcePositionImpl +public class DeclarationSourcePositionImpl extends CompoundSourcePositionImpl implements DeclarationSourcePosition, Serializable { private static final long serialVersionUID = 1L; private int modifierSourceEnd; private int modifierSourceStart; - private int declarationSourceStart; - private int declarationSourceEnd; public DeclarationSourcePositionImpl(CompilationUnit compilationUnit, int sourceStart, int sourceEnd, int modifierSourceStart, int modifierSourceEnd, int declarationSourceStart, int declarationSourceEnd, int[] lineSeparatorPositions) { super(compilationUnit, - sourceStart, sourceEnd, + sourceStart, sourceEnd, declarationSourceStart, declarationSourceEnd, lineSeparatorPositions); checkArgsAreAscending(declarationSourceStart, modifierSourceStart, modifierSourceEnd + 1, sourceStart, sourceEnd + 1, declarationSourceEnd + 1); this.modifierSourceStart = modifierSourceStart; - this.declarationSourceStart = declarationSourceStart; - this.declarationSourceEnd = declarationSourceEnd; if (this.modifierSourceStart == 0) { this.modifierSourceStart = declarationSourceStart; } this.modifierSourceEnd = modifierSourceEnd; } - @Override - public int getSourceEnd() { - return declarationSourceEnd; - } - - @Override - public int getSourceStart() { - return declarationSourceStart; - } - @Override public int getModifierSourceStart() { return modifierSourceStart; } - @Override - public int getNameStart() { - return super.getSourceStart(); - } - - @Override - public int getNameEnd() { - return super.getSourceEnd(); - } - public void setModifierSourceEnd(int modifierSourceEnd) { this.modifierSourceEnd = modifierSourceEnd; } @@ -84,13 +60,9 @@ public int getModifierSourceEnd() { return modifierSourceEnd; } - public int getEndLine() { - return searchLineNumber(declarationSourceEnd); - } - @Override public String getSourceDetails() { - return super.getSourceDetails() + return getFragment(getSourceStart(), getSourceEnd()) + "\nmodifier = " + getFragment(getModifierSourceStart(), getModifierSourceEnd()) + "\nname = " + getFragment(getNameStart(), getNameEnd()); }