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());
}