spoon.reflect.declaration.CtExecutable Java Examples

The following examples show how to use spoon.reflect.declaration.CtExecutable. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: DeepRepairEngine.java    From astor with GNU General Public License v2.0 6 votes vote down vote up
public void loadCloneGranularity() throws Exception {
	ExtensionPoints cloneGranularityEP = ExtensionPoints.CLONE_GRANULARITY;

	String property = ConfigurationProperties.getProperty(cloneGranularityEP.identifier);

	Class cloneGranularity = null;
	if (property == null || property.trim().isEmpty() || property.equals("type")) {
		cloneGranularity = CtType.class;

	} else if (property.equals("executable")) {
		cloneGranularity = CtExecutable.class;
	} else {
		cloneGranularity = PlugInLoader.loadClassFromProperty(cloneGranularityEP);
		if (cloneGranularity == null) {
			cloneGranularity = CtType.class;
		}
	}
	ConfigurationProperties.setProperty("clonegranularity", cloneGranularity.getName());
}
 
Example #2
Source File: NotNullCheckAdderProcessor.java    From spoon-examples with GNU General Public License v2.0 6 votes vote down vote up
@Override
public void process(CtParameter<?> element) {
	// we declare a new snippet of code to be inserted.
	CtCodeSnippetStatement snippet = getFactory().Core().createCodeSnippetStatement();

	// this snippet contains an if check.
	final String value = String.format("if (%s == null) "
			+ "throw new IllegalArgumentException(\"[Spoon inserted check] null passed as parameter\");",
			element.getSimpleName());
	snippet.setValue(value);

	// we insert the snippet at the beginning of the method body.
	if (element.getParent(CtExecutable.class).getBody() != null) {
		element.getParent(CtExecutable.class).getBody().insertBegin(snippet);
	}
}
 
Example #3
Source File: BoundTemplateProcessor.java    From spoon-examples with GNU General Public License v2.0 6 votes vote down vote up
public void process(Bound annotation, CtParameter<?> element) {
	// Is to be process?
	CtExecutable<?> e = element.getParent();
	if (e.getBody() == null) {
		return;
	}

	// Use template.
	CtClass<?> type = e.getParent(CtClass.class);
	Template t = new BoundTemplate(getFactory().Type().createReference(Double.class), element.getSimpleName(), annotation.min(), annotation.max());
	final CtBlock apply = (CtBlock) t.apply(type);

	// Apply transformation.
	for (int i = apply.getStatements().size() - 1; i >= 0; i--) {
		final CtStatement statement = apply.getStatement(i);
		statement.delete();
		e.getBody().insertBegin(statement);
	}
}
 
Example #4
Source File: CloneIngredientSearchStrategy4Exhaustive.java    From astor with GNU General Public License v2.0 6 votes vote down vote up
private void setfilter() {
	if (cls.equals(CtType.class)) {
		typeFilter = new TypeFilter<CtType>(CtType.class) {
			@Override
			public boolean matches(CtType element) {
				// Definition of "top level" CtType.
				return element.getParent(CtType.class) == null
						&& !element.isImplicit();
			}
		};
	} else if (cls.equals(CtExecutable.class)) {
		typeFilter = new TypeFilter<CtExecutable>(CtExecutable.class) {
			@Override
			public boolean matches(CtExecutable element) {
				// Definition of "top level" CtExecutable.
				return element.getParent(CtExecutable.class) == null
						&& !element.isImplicit()
						&& !(element instanceof CtAnonymousExecutable);
			}
		};
	} else {
		log.error("Invalid clonegranularity");
		throw new IllegalArgumentException();
	}
	log.debug("clonegranularity: " + cls.getName());
}
 
Example #5
Source File: StatementSupporter.java    From astor with GNU General Public License v2.0 6 votes vote down vote up
/**
 * Updates the implicitly of a block. Workarround for Spoon 5.4.0
 * 
 * @param block
 * @param isInsert
 */
public static void updateBlockImplicitly(CtBlock block, boolean isInsert) {

	if (!block.isImplicit() && block.getStatements().size() == 1 && !(block.getParent() instanceof CtExecutable)) {
		block.setImplicit(true);
	} else {
		if (isInsert) {
			if (block.isImplicit() && block.getStatements().size() > 1) {
				block.setImplicit(false);
			}
		} else {// Delete
			if (block.isImplicit() && block.getStatements().size() == 0) {
				block.setImplicit(false);
			}
		}
	}
}
 
Example #6
Source File: DocProcessor.java    From spoon-examples with GNU General Public License v2.0 5 votes vote down vote up
public void process(CtElement element) {
	if (element instanceof CtType || element instanceof CtField || element instanceof CtExecutable) {
		Set<ModifierKind> modifiers = ((CtModifiable) element).getModifiers();
		if (modifiers.contains(PUBLIC) || modifiers.contains(PROTECTED)) {
			String docComment = element.getDocComment();
			if (docComment == null || docComment.equals("")) {
				System.out.println("undocumented element at " + element.getPosition());
				undocumentedElements.add(element);
			}
		}
	}
}
 
Example #7
Source File: CloneIngredientSearchStrategy4Exhaustive.java    From astor with GNU General Public License v2.0 5 votes vote down vote up
private String getkey(T element) {
	String key;
	if (element instanceof CtExecutable) {
		key = element.getParent(CtType.class).getQualifiedName() + "#" + ((CtExecutable<?>) element).getSignature();
	} else if (element instanceof CtType) {
		key = ((CtType<?>) element).getQualifiedName();
	} else {
		log.error("Invalid clonegranularity");
		throw new IllegalArgumentException();
	}
	return key;
}
 
Example #8
Source File: CloneIngredientSearchStrategy.java    From astor with GNU General Public License v2.0 5 votes vote down vote up
@Override
public boolean matches(CtExecutable element) {
	// Definition of "top level" CtExecutable.
	boolean t = element.getParent(CtExecutable.class) == null && !element.isImplicit()
			&& !(element instanceof CtAnonymousExecutable);
	return t;
}
 
Example #9
Source File: CloneIngredientSearchStrategy.java    From astor with GNU General Public License v2.0 5 votes vote down vote up
private String getkey(T element) {
	String key;
	if (element instanceof CtExecutable) {
		key = element.getParent(CtType.class).getQualifiedName() + "#" + ((CtExecutable<?>) element).getSignature();
	} else if (element instanceof CtType) {
		key = ((CtType<?>) element).getQualifiedName();
	} else {
		log.error("Invalid clonegranularity");
		throw new IllegalArgumentException();
	}
	return key;
}
 
Example #10
Source File: IngredientPoolTest.java    From astor with GNU General Public License v2.0 5 votes vote down vote up
@Test
public void testMath85ScopeMethodSpace() throws Exception {

	AstorMain main1 = new AstorMain();
	String dep = new File("./examples/libs/junit-4.4.jar").getAbsolutePath();
	String[] args = new String[] { "-dependencies", dep, "-mode", "jgenprog", "-failing",
			"org.apache.commons.math.distribution.NormalDistributionTest", "-location",
			new File("./examples/math_85").getAbsolutePath(), "-package", "org.apache.commons", "-srcjavafolder",
			"/src/java/", "-srctestfolder", "/src/test/", "-binjavafolder", "/target/classes", "-bintestfolder",
			"/target/test-classes", "-javacompliancelevel", "7", "-flthreshold", "0.5", "-stopfirst", "false",
			// We put 0 as max generation, so we force to not evolve the
			// population
			"-maxgen", "0", "-scope", MethodBasicIngredientScope.class.getCanonicalName(), //
			"-seed", "10", "-ingredientstrategy", ShortestIngredientSearchStrategy.class.getName() };

	main1.execute(args);
	JGenProg astor = (JGenProg) main1.getEngine();
	IngredientSearchStrategy ingStrategy = astor.getIngredientSearchStrategy();

	//
	AstorOperator operator = new ReplaceOp();
	// Let's take a modification point from the first variant. I take the
	// element at 12, it's an assignement.
	ModificationPoint mpoint = astor.getVariants().get(0).getModificationPoints().get(12);
	Ingredient ingLast = ingStrategy.getFixIngredient(mpoint, operator);
	Assert.assertNotNull(ingLast);

	List<String> methods = ingStrategy.getIngredientSpace().getLocations();
	Assert.assertTrue(methods.size() > 0);

	List<Ingredient> ingredients = ingStrategy.getIngredientSpace().getIngredients(mpoint.getCodeElement());
	Assert.assertTrue(ingredients.size() > 0);
	Assert.assertTrue(hasIngredient(ingredients, ingLast));

	CtExecutable exec = (mpoint.getCodeElement().getParent(CtExecutable.class));
	for (Ingredient ctCodeElement : ingredients) {
		assertEquals(exec, ctCodeElement.getCode().getParent(CtExecutable.class));
	}

}
 
Example #11
Source File: LogProcessor.java    From spoon-examples with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void process(CtExecutable element) {
	CtCodeSnippetStatement snippet = getFactory().Core().createCodeSnippetStatement();

	// Snippet which contains the log.
	final String value = String.format("System.out.println(\"Enter in the method %s from class %s\");",
			element.getSimpleName(),
			element.getParent(CtClass.class).getSimpleName());
	snippet.setValue(value);

	// Inserts the snippet at the beginning of the method body.
	if (element.getBody() != null) {
		element.getBody().insertBegin(snippet);
	}
}
 
Example #12
Source File: StatCollector.java    From nopol with GNU General Public License v2.0 5 votes vote down vote up
private boolean isMethod(CtElement ctElement) {
    CtExecutable parent = ctElement.getParent(CtExecutable.class);
    if (parent == null) {
        return false;
    }
    return parent.getSimpleName().equals(buggyMethod);
}
 
Example #13
Source File: CodeFeatureDetectorTest.java    From coming with MIT License 4 votes vote down vote up
@Test
public void testProperty_Missing_Feature_Groups() {

	String content = "" + "class X {" +
	//
			"public X() {" + "int b = 0;" + "System.out.println(b);" + "}"
			//
			+ "public Object foo() {" //
			+ "int a = 1;"//
			+ "int b = a;" + "float f = 0;" + "" + "return f;" + "}" //
			+ "public float getFloat(){return 1.0;}"//
			+ "public double getConvertFloat(int i){return 0.0;}"//
			+ "public double getConvert2Float(int i){String s2;Integer.valueOf(s2);return 0.0;}"//
			+ "};";

	CtType type = getCtType(content);

	assertNotNull(type);
	CtExecutable method = (CtExecutable) type.getAllExecutables().stream()
			.filter(e -> ((CtExecutableReference) e).getExecutableDeclaration().getSimpleName().equals("X")
					|| ((CtExecutableReference) e).getExecutableDeclaration().getSimpleName().equals("<init>"))
			.findFirst().get().getExecutableDeclaration();

	assertNotNull(method);

	CtElement stassig = method.getBody().getStatements().stream()
			.filter(e -> e.toString().contains("System.out.println(b)")).findFirst().get();

	CodeFeatureDetector cntxResolver = new CodeFeatureDetector();
	Cntx cntx = cntxResolver.analyzeFeatures(stassig);

	printJSon(cntx.toJSON());

	Boolean hasFeat_vars = cntx.getInformation().containsKey("FEATURES_VARS");
	assertTrue(hasFeat_vars);

	Boolean hasFeat_method = cntx.getInformation().containsKey("FEATURES_METHODS");
	assertTrue(hasFeat_method);

	Cntx feat_vars = (Cntx) cntx.getInformation().get("FEATURES_VARS");
	assertFalse(feat_vars.getInformation().isEmpty());

	Cntx feat_method = (Cntx) cntx.getInformation().get("FEATURES_METHODS");
	assertFalse(feat_method.getInformation().isEmpty());

	Boolean hasS6 = cntx.getInformation().containsKey(CodeFeatures.S6_METHOD_THROWS_EXCEPTION.toString());

	assertTrue(hasS6);

}
 
Example #14
Source File: MethodXMethodReplacementDiffArgumentsOp.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 *
 * 
 * @param suspiciousElement
 * @param context
 * @return
 */
@Override
public MapList<CtInvocation, Ingredient> retrieveInvocationIngredient(ModificationPoint point) {
	CtElement suspiciousElement = point.getCodeElement();

	CtClass classUnderAnalysis = suspiciousElement.getParent(CtClass.class);

	MapList<CtInvocation, Ingredient> similarInvocationResult = new MapList<>();

	List<CtInvocation> invocations = getInvocations(suspiciousElement);
	for (CtInvocation invocationToReplace : invocations) {

		CtExecutable minvokedInAffected = invocationToReplace.getExecutable().getDeclaration();

		if (minvokedInAffected == null || !(minvokedInAffected instanceof CtMethod))
			continue;

		CtMethod affectedMethod = (CtMethod) minvokedInAffected;

		CtType typeOfTarget = invocationToReplace.getTarget().getType().getTypeDeclaration();

		if (!(typeOfTarget instanceof CtClass))
			continue;

		CtClass targetOfInvocation = (CtClass) typeOfTarget;

		List allMethods = SupportOperators.getAllMethodsFromClass(targetOfInvocation);

		for (Object omethod : allMethods) {

			if (!(omethod instanceof CtMethod))
				continue;

			CtMethod anotherMethod = (CtMethod) omethod;

			if (anotherMethod.getSimpleName().startsWith(VarReplacementByMethodCallOp.META_METHOD_LABEL))
				// It's a meta-method, discard
				continue;

			if (anotherMethod.getSignature().equals(affectedMethod.getSignature()))
				// It's the same, we discard it.
				continue;

			// Only if the target is the class we can call to non public methods
			if (!targetOfInvocation.equals(classUnderAnalysis) && !anotherMethod.isPublic())
				continue;

			// The name must be the same
			if (anotherMethod.getSimpleName().equals(affectedMethod.getSimpleName())) {

				if (anotherMethod.getType() != null && minvokedInAffected.getType() != null) {

					boolean compatibleReturnTypes = SupportOperators.checkIsSubtype(anotherMethod.getType(),
							minvokedInAffected.getType());
					// must return the same object
					if (compatibleReturnTypes) {

						// Case 3: Different number argument
						if (anotherMethod.getParameters().size() != affectedMethod.getParameters().size()
								// check the types
								|| (!anotherMethod.getParameters().isEmpty()
										&& !affectedMethod.getParameters().isEmpty()
										&& !anotherMethod.getParameters().equals(affectedMethod.getParameters()))) {

							List<CtInvocation> newInvToMethods = SupportOperators
									.createRealInvocationsReusingVars(point, anotherMethod, invocationToReplace);

							for (CtInvocation ctInvocation : newInvToMethods) {
								CtInvocation newInvocation = ctInvocation.clone();
								newInvocation.setExecutable(anotherMethod.getReference());
								Ingredient newIngredient = new Ingredient(newInvocation);
								newIngredient.setDerivedFrom(invocationToReplace);
								similarInvocationResult.add(invocationToReplace, newIngredient);
								newIngredient.getMetadata().put("original", invocationToReplace);
								newIngredient.getMetadata().put("replacement", ctInvocation);

							}

						}
					}

				}
			}
		}

	}
	return similarInvocationResult;

}
 
Example #15
Source File: MethodXMethodReplacementArgumentRemoveOp.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
/**
 * Case 1: Argument removement
 * 
 * @param suspiciousElement
 * @param context
 * @return
 */
@Override
public MapList<CtInvocation, Ingredient> retrieveInvocationIngredient(ModificationPoint point) {

	CtElement suspiciousElement = point.getCodeElement();
	CtClass classUnderAnalysis = suspiciousElement.getParent(CtClass.class);

	MapList<CtInvocation, Ingredient> similarInvocationResult = new MapList<>();

	List<CtInvocation> invocations = getInvocations(suspiciousElement);

	for (CtInvocation invocationToReplace : invocations) {

		CtExecutable minvokedInAffected = invocationToReplace.getExecutable().getDeclaration();

		if (minvokedInAffected == null || !(minvokedInAffected instanceof CtMethod))
			continue;

		CtMethod affectedMethod = (CtMethod) minvokedInAffected;

		CtType typeOfTarget = invocationToReplace.getTarget().getType().getTypeDeclaration();

		if (!(typeOfTarget instanceof CtClass))
			continue;

		CtClass targetOfInvocation = (CtClass) typeOfTarget;

		List allMethods = SupportOperators.getAllMethodsFromClass(targetOfInvocation);

		for (Object omethod : allMethods) {

			if (!(omethod instanceof CtMethod))
				continue;

			CtMethod anotherMethod = (CtMethod) omethod;

			if (anotherMethod.getSimpleName().startsWith(VarReplacementByMethodCallOp.META_METHOD_LABEL))
				// It's a meta-method, discard
				continue;

			if (anotherMethod.getSignature().equals(affectedMethod.getSignature()))
				// It's the same, we discard it.
				continue;

			// Only if the target is the class we can call to non public methods
			if (!targetOfInvocation.equals(classUnderAnalysis) && !anotherMethod.isPublic())
				continue;

			// The name must be the same
			if (anotherMethod.getSimpleName().equals(affectedMethod.getSimpleName())) {

				if (anotherMethod.getType() != null && minvokedInAffected.getType() != null) {

					boolean compatibleReturnTypes = SupportOperators.checkIsSubtype(anotherMethod.getType(),
							minvokedInAffected.getType());
					// must return the same object
					if (compatibleReturnTypes) {

						// CASE 1: Different method name
						if (anotherMethod.getParameters().size() < affectedMethod.getParameters().size()) {

							List newArguments = SupportOperators.checkOcurrenceOfOtherParameters(anotherMethod,
									affectedMethod, invocationToReplace.getArguments());
							if (newArguments != null) {

								CtInvocation newInvocation = MutationSupporter.getFactory().createInvocation(
										invocationToReplace.getTarget(), anotherMethod.getReference(),
										newArguments);
								newInvocation.setExecutable(anotherMethod.getReference());
								newInvocation.setArguments(newArguments);
								newInvocation.setTarget(invocationToReplace.getTarget());

								Ingredient newIngredient = new Ingredient(newInvocation);
								newIngredient.setDerivedFrom(invocationToReplace);

								similarInvocationResult.add(invocationToReplace, newIngredient);

								newIngredient.getMetadata().put("original", invocationToReplace);
								newIngredient.getMetadata().put("replacement", newInvocation);
							}
						}
					}

				}
			}
		}

	}
	return similarInvocationResult;

}
 
Example #16
Source File: MethodBasicIngredientScope.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
@Override
public String calculateLocation(CtElement original) {
	CtExecutable method =  original.getParent(CtExecutable.class);
	return method.getReference().toString();
}
 
Example #17
Source File: CodeFeatureDetectorTest.java    From coming with MIT License 4 votes vote down vote up
@Test
public void testProperty_Missing_S6_METHOD_THROWS_EXCEPTION() {

	String content = "" + "class X {"
	//
			+ "public X() {" + "int b = 0;" + "}"
			//
			+ "public Object foo() {" //
			+ "int a = 1;"//
			+ "int b = a;" + "float f = 0;" + "" + "return f;" + "}" //
			+ "public float getFloat(){return 1.0;}"//
			+ "public double getConvertFloat(int i){return 0.0;}"//
			+ "public double getConvert2Float(int i){String s2;Integer.valueOf(s2);return 0.0;}"//
			+ "};";

	CtType type = getCtType(content);

	assertNotNull(type);
	CtExecutable method = (CtExecutable) type.getAllExecutables().stream()
			.filter(e -> ((CtExecutableReference) e).getExecutableDeclaration().getSimpleName().equals("X")
					|| ((CtExecutableReference) e).getExecutableDeclaration().getSimpleName().equals("<init>"))
			.findFirst().get().getExecutableDeclaration();

	assertNotNull(method);
	System.out.println(method);
	CtElement stassig = method.getBody().getStatements().stream().filter(e -> e.toString().startsWith("int b = 0"))
			.findFirst().get();
	System.out.println(stassig);
	CodeFeatureDetector cntxResolver = new CodeFeatureDetector();
	Cntx cntx = cntxResolver.analyzeFeatures(stassig);

	printJSon(cntx.toJSON());

	Cntx feat_vars = (Cntx) cntx.getInformation().get("FEATURES_VARS");
	assertTrue(feat_vars.getInformation().isEmpty());

	Boolean hasFeat_method = cntx.getInformation().containsKey("FEATURES_METHOD_INVOCATION");
	assertTrue(hasFeat_method);

	Cntx feat_method = (Cntx) cntx.getInformation().get("FEATURES_METHOD_INVOCATION");
	assertTrue(feat_method.getInformation().isEmpty());

	Boolean hasS6 = cntx.getInformation().containsKey(CodeFeatures.S6_METHOD_THROWS_EXCEPTION.toString());

	assertTrue(hasS6);

}
 
Example #18
Source File: LangTest.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
public CommandSummary commandLang8(String dep, File out, boolean step) {

		ClassLoader classLoader = getClass().getClassLoader();
		File learningDir = new File(classLoader.getResource("learninglang8").getFile());
		Class cloneGranularityClass = CtExecutable.class;
		String scope = CtClassIngredientSpace.class.getCanonicalName();

		String[] args = new String[] { "-dependencies", dep, "-mode", "jgenprog", "-failing",
				"org.apache.commons.lang3.time.FastDateFormat_PrinterTest" + File.pathSeparator
						+ "org.apache.commons.lang3.time.FastDatePrinterTest",
				//
				"-location", new File("./examples/lang_8/").getAbsolutePath(),
				//
				//
				// "-package", "org.apache.commons",
				"-srcjavafolder", "/src/main/java/", "-srctestfolder", "/src/test/java/", "-binjavafolder",
				"/target/classes/", //
				"-bintestfolder", "/target/tests/", "-javacompliancelevel", "6", "-flthreshold", "0.1",
				//
				"-out", out.getAbsolutePath(), "-scope", "package", "-seed", "60", "-maxgen", "200",
				//
				"-stopfirst", "true", "-maxtime", "10", (step) ? "-testbystep" : "",
				// "-validation", RegressionValidation.class.getName(),
				//
				// "-ignoredtestcases",
				// "org.apache.commons.lang.LocaleUtilsTest",
				"-timezone", "America/New_York",
				//
				"-scope", scope,
				//
				"-learningdir", learningDir.getAbsolutePath(),
				//
				"-clonegranularity", cloneGranularityClass.getCanonicalName(),
				//
				"-ingredientstrategy", CloneIngredientSearchStrategy.class.getName(),
				//
				"-transformingredient",

		};
		return new CommandSummary(args);
	}
 
Example #19
Source File: CloneIngredientSearchStrategy.java    From astor with GNU General Public License v2.0 4 votes vote down vote up
@Override
public boolean matches(CtExecutable element) {
	// Definition of "top level" CtExecutable.
	return element.getParent(CtExecutable.class) == null && !element.isImplicit()
			&& !(element instanceof CtAnonymousExecutable);
}
 
Example #20
Source File: AbstractCodeAnalyzer.java    From coming with MIT License 4 votes vote down vote up
public boolean[] analyze_SametypewithGuard(List<CtVariableAccess> varsAffected, CtElement element,
			CtClass parentClass, List<CtStatement> statements) {

		boolean hasPrimitiveSimilarTypeWithNormalGuard = false;
		boolean hasObjectSimilarTypeWithNormalGuard = false;
		boolean hasPrimitiveSimilarTypeWithNullGuard = false;
		boolean hasObjectSimilarTypeWithNullGuard = false;

		try {
			CtExecutable faultyMethodParent = element.getParent(CtExecutable.class);

			if (faultyMethodParent == null)
				// the element is not in a method.
				return null;

			// For each variable affected
			for (CtVariableAccess variableAffected : varsAffected) {
				// for (CtStatement aStatement : statements) {
				CtStatement parent = variableAffected.getParent(new LineFilter());

				if (isNormalGuard(variableAffected, (parent)) || isNullCheckGuard(variableAffected, (parent)))
					continue;

				// For each statement in the method (it includes the statements inside the
				// blocks (then, while)!)
				for (CtStatement aStatement : statements) {
					// for (CtVariableAccess variableAffected : varsAffected) {

					if (parent == aStatement)
						continue;

					List<CtVariableAccess> varsFromStatement;

					if (aStatement instanceof CtIf || aStatement instanceof CtLoop) {
						varsFromStatement = VariableResolver.collectVariableRead(retrieveElementToStudy(aStatement));
					} else
						varsFromStatement = VariableResolver.collectVariableRead(aStatement);
//
//					// let's collect the var access in the statement
//					List<CtVariableAccess> varsFromStatement = VariableResolver
//							.collectVariableReadIgnoringBlocks(aStatement);
					// if the var access is the same that the affected
					for (CtVariableAccess varInStatement : varsFromStatement) {
						// Has similar type but different name
						if (compareTypes(variableAffected.getVariable().getType(),
								varInStatement.getVariable().getType())) {
							// && !hasSameName(variableAffected, varInStatement)) {
							// Now, let's check if the parent is a guard
							// if (isGuard(getParentNotBlock(aStatement))) {
							if (isNormalGuard(varInStatement, (aStatement))) {

								// it's ok, now let's check the type
								if (variableAffected.getType() != null) {
									// for primitive type variables, we require it to be the same global variable
									if (variableAffected.getType().isPrimitive() && varInStatement.getVariable()
											.getSimpleName().equals(variableAffected.getVariable().getSimpleName()))
										hasPrimitiveSimilarTypeWithNormalGuard = true;
									else
										hasObjectSimilarTypeWithNormalGuard = true;
								}
							}

							if (isNullCheckGuard(varInStatement, (aStatement))) {

								// it's ok, now let's check the type
								if (variableAffected.getType() != null) {

									if (variableAffected.getType().isPrimitive() && varInStatement.getVariable()
											.getSimpleName().equals(variableAffected.getVariable().getSimpleName()))
										hasPrimitiveSimilarTypeWithNullGuard = true;
									else
										hasObjectSimilarTypeWithNullGuard = true;
								}
							}

						}
					}
					// If we find both cases, we can stop
					if (hasPrimitiveSimilarTypeWithNormalGuard && hasObjectSimilarTypeWithNormalGuard
							&& hasPrimitiveSimilarTypeWithNullGuard && hasObjectSimilarTypeWithNullGuard)
						break;
				}
			}

		} catch (Throwable e) {
			e.printStackTrace();
		}

		boolean[] expressionvalue = new boolean[4];
		expressionvalue[0] = hasObjectSimilarTypeWithNormalGuard;
		expressionvalue[1] = hasPrimitiveSimilarTypeWithNormalGuard;
		expressionvalue[2] = hasObjectSimilarTypeWithNullGuard;
		expressionvalue[3] = hasPrimitiveSimilarTypeWithNullGuard;

		return expressionvalue;

	}
 
Example #21
Source File: WholeStatementAnalyzer.java    From coming with MIT License 4 votes vote down vote up
/**
 * whether the associated method or class for the faulty line throws exception
 * 
 * @param element
 * @param context
 */
@SuppressWarnings({ "unchecked", "rawtypes" })
private void analyzeS6S11_Method_Method_Features(CtElement element, Cntx<Object> context) {
	try {

		CtExecutable parentMethod = element.getParent(CtExecutable.class);

		CtClass parentClass = element.getParent(CtClass.class);

		CtStatement parent = element.getParent(new LineFilter());
		CtTry potentionalTryCatch = element.getParent(CtTry.class);

		if (potentionalTryCatch != null && whethereffectivetrycatch(potentionalTryCatch, parent)) {

			context.put(CodeFeatures.S6_METHOD_THROWS_EXCEPTION, false);
			context.put(CodeFeatures.S11_FAULTY_CLASS_EXCEPTION_TYPE, false);

		} else {

			if (parentMethod != null) {
				// Exception
				context.put(CodeFeatures.S6_METHOD_THROWS_EXCEPTION, parentMethod.getThrownTypes().size() > 0);
			}

			boolean s11ExceptionType = false;

			if (parentClass != null) {

				Set<CtTypeReference<?>> superInterfaces = parentClass.getSuperInterfaces();
				CtTypeReference<?> superType = parentClass.getSuperclass();

				if (superType != null && superType.getQualifiedName().toLowerCase().indexOf("exception") != -1)
					s11ExceptionType = true;

				if (superInterfaces.size() > 0) {
					for (CtTypeReference specificreference : superInterfaces) {
						if (specificreference != null
								&& specificreference.getQualifiedName().toLowerCase().indexOf("exception") != -1) {
							s11ExceptionType = true;
							break;
						}
					}
				}
				context.put(CodeFeatures.S11_FAULTY_CLASS_EXCEPTION_TYPE, s11ExceptionType);
			}
		}
	} catch (Throwable e) {
		e.printStackTrace();
	}
}
 
Example #22
Source File: VariableAnalyzer.java    From coming with MIT License 4 votes vote down vote up
private void analyzeV15_LastthreeVariableIntroduction (List<CtVariableAccess> varsAffected, CtElement element,
		Cntx<Object> context) {
	try {
		
		CtExecutable methodParent = element.getParent(CtExecutable.class);

		if (methodParent == null)
			// the element is not in a method.
			return;
		
		List<CtStatement> statements=methodParent.getElements(new LineFilter());

		// For each variable affected
		for (CtVariableAccess variableAffected : varsAffected) {

			List<CtStatement> statementbefore = new ArrayList<>();
			
			boolean lastthreesametypeloc=false;

			for (CtStatement aStatement : statements) {

				CtStatement parent = variableAffected.getParent(new LineFilter());
									
				if (!isElementBeforeVariable(variableAffected, aStatement))
					continue;
				
				if (isStatementInControl(parent, aStatement) || parent==aStatement)
					continue;
				
				if(aStatement instanceof CtIf || aStatement instanceof CtLoop) 
					continue;
				
				statementbefore.add(aStatement);
			}
			
			List<CtStatement> statinterest = new ArrayList<>();
			
			if(statementbefore.size()<=4)
				statinterest=statementbefore;
			else {
				statinterest.add(statementbefore.get(statementbefore.size()-1));
				statinterest.add(statementbefore.get(statementbefore.size()-2));
				statinterest.add(statementbefore.get(statementbefore.size()-3));
				statinterest.add(statementbefore.get(statementbefore.size()-4));
			}

			for (int index=0; index< statinterest.size(); index++) {
				if(statinterest.get(index) instanceof CtLocalVariable) {
					CtLocalVariable ctLocalVariable=(CtLocalVariable)statinterest.get(index);

					if (!ctLocalVariable.getReference().getSimpleName()
							.equals(variableAffected.getVariable().getSimpleName()) 
							&& compareTypes(ctLocalVariable.getType(), variableAffected.getType())) {
						lastthreesametypeloc = true;
						break;
					}
				}
			}
			
			writeGroupedInfo(context, adjustIdentifyInJson(variableAffected), 
					CodeFeatures.V15_VAR_LAST_THREE_SAME_TYPE_LOC,
					(lastthreesametypeloc), "FEATURES_VARS");
		}
	} catch (Throwable e) {
		e.printStackTrace();
	}
}
 
Example #23
Source File: MethodXMethodReplacementDiffNameOp.java    From astor with GNU General Public License v2.0 2 votes vote down vote up
/**
 * For case 2
 * 
 * @param suspiciousElement
 * @param context
 * @return
 */
@Override
public MapList<CtInvocation, Ingredient> retrieveInvocationIngredient(ModificationPoint point) {
	CtElement suspiciousElement = point.getCodeElement();

	CtClass classUnderAnalysis = suspiciousElement.getParent(CtClass.class);

	MapList<CtInvocation, Ingredient> similarInvocationResult = new MapList<>();

	List<CtInvocation> invocations = getInvocations(suspiciousElement);

	for (CtInvocation invocationToReplace : invocations) {

		CtExecutable minvokedInAffected = invocationToReplace.getExecutable().getDeclaration();

		if (minvokedInAffected == null || !(minvokedInAffected instanceof CtMethod))
			continue;

		CtMethod affectedMethod = (CtMethod) minvokedInAffected;

		CtType typeOfTarget = invocationToReplace.getTarget().getType().getTypeDeclaration();

		if (!(typeOfTarget instanceof CtClass))
			continue;

		CtClass targeClasstOfInvocation = (CtClass) typeOfTarget;

		List allMethods = SupportOperators.getAllMethodsFromClass(targeClasstOfInvocation);

		for (Object omethod : allMethods) {

			if (!(omethod instanceof CtMethod))
				continue;

			CtMethod anotherMethod = (CtMethod) omethod;

			if (anotherMethod.getSignature().equals(affectedMethod.getSignature()))
				// It's the same, we discard it.
				continue;

			if (anotherMethod.getSimpleName().startsWith(VarReplacementByMethodCallOp.META_METHOD_LABEL))
				// It's a meta-method, discard
				continue;

			// Only if the target is the class we can call to non public methods
			if (!targeClasstOfInvocation.equals(classUnderAnalysis) && !anotherMethod.isPublic())
				continue;

			if (anotherMethod.getSimpleName().equals(affectedMethod.getSimpleName())) {
				// It's override
				// TODO:
				// similarInvocationResult.add(affectedMethod, anotherMethod);

			}

			if (anotherMethod.getType() != null && minvokedInAffected.getType() != null) {

				boolean compatibleReturnTypes = SupportOperators.checkIsSubtype(anotherMethod.getType(),
						minvokedInAffected.getType());
				if (compatibleReturnTypes) {

					// CASE 2: Different method name
					if (anotherMethod.getParameters().size() == affectedMethod.getParameters().size()
							&& anotherMethod.getParameters().equals(affectedMethod.getParameters())) {

						List<CtInvocation> newInvToMethods = SupportOperators
								.createRealInvocationsReusingVars(point, anotherMethod, invocationToReplace);

						for (CtInvocation aNewInvocation : newInvToMethods) {
							CtInvocation newInvocationCloned = aNewInvocation.clone();
							newInvocationCloned.setExecutable(anotherMethod.getReference());
							Ingredient newIngredient = new Ingredient(newInvocationCloned);
							newIngredient.setDerivedFrom(invocationToReplace);
							newIngredient.getMetadata().put("original", invocationToReplace);
							newIngredient.getMetadata().put("replacement", aNewInvocation);

							similarInvocationResult.add(invocationToReplace, newIngredient);

						}
					}
				}

			}

		}

	}
	return similarInvocationResult;

}