Summary: public Some more examples to explain the behaviour of the type checker with inheritance Reviewed By: cristianoc Differential Revision: D2639908 fb-gh-sync-id: d038061master
							parent
							
								
									8fb90ccf54
								
							
						
					
					
						commit
						2e01d3402f
					
				@ -0,0 +1,60 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2013 - present Facebook, Inc.
 | 
				
			||||||
 | 
					* All rights reserved.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This source code is licensed under the BSD style license found in the
 | 
				
			||||||
 | 
					* LICENSE file in the root directory of this source tree. An additional grant
 | 
				
			||||||
 | 
					* of patent rights can be found in the PATENTS file in the same directory.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package codetoanalyze.java.checkers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.facebook.infer.annotation.Expensive;
 | 
				
			||||||
 | 
					import com.facebook.infer.annotation.PerformanceCritical;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					interface I {
 | 
				
			||||||
 | 
					  void foo();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class A implements I {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @SuppressWarnings("infer") // In case we really want to implement foo as expensive
 | 
				
			||||||
 | 
					  @Expensive
 | 
				
			||||||
 | 
					  public void foo() {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class B extends A implements I {
 | 
				
			||||||
 | 
					  public void foo() {}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExpensiveInheritanceExample {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @PerformanceCritical
 | 
				
			||||||
 | 
					  void shouldNotReportBecauseInterfaceNotAnnotated(I i) {
 | 
				
			||||||
 | 
					    i.foo();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @PerformanceCritical
 | 
				
			||||||
 | 
					  void reportsBecauseFooIsExpensiveInA() {
 | 
				
			||||||
 | 
					    A a = new A();
 | 
				
			||||||
 | 
					    a.foo();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @PerformanceCritical
 | 
				
			||||||
 | 
					  void doesNotreportBecauseFooIsNotExpensiveInB() {
 | 
				
			||||||
 | 
					    A a = new B();
 | 
				
			||||||
 | 
					    a.foo();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  A actuallyReturnsObjectOfTypeB() {
 | 
				
			||||||
 | 
					    return new B();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @PerformanceCritical
 | 
				
			||||||
 | 
					  void reportsAssumingObjectOfTypeA() {
 | 
				
			||||||
 | 
					    A a = actuallyReturnsObjectOfTypeB();
 | 
				
			||||||
 | 
					    a.foo();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -0,0 +1,55 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					* Copyright (c) 2015 - present Facebook, Inc.
 | 
				
			||||||
 | 
					* All rights reserved.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* This source code is licensed under the BSD style license found in the
 | 
				
			||||||
 | 
					* LICENSE file in the root directory of this source tree. An additional grant
 | 
				
			||||||
 | 
					* of patent rights can be found in the PATENTS file in the same directory.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package endtoend.java.checkers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import static org.hamcrest.MatcherAssert.assertThat;
 | 
				
			||||||
 | 
					import static utils.matchers.ResultContainsExactly.containsExactly;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.junit.BeforeClass;
 | 
				
			||||||
 | 
					import org.junit.Test;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import utils.InferException;
 | 
				
			||||||
 | 
					import utils.InferResults;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class ExpensiveInheritanceTest {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public static final String SOURCE_FILE =
 | 
				
			||||||
 | 
					    "infer/tests/codetoanalyze/java/checkers/ExpensiveInheritanceExample.java";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public static final String CALLS_EXPENSIVE_METHOD =
 | 
				
			||||||
 | 
					    "CHECKERS_CALLS_EXPENSIVE_METHOD";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private static InferResults inferResults;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @BeforeClass
 | 
				
			||||||
 | 
					  public static void loadResults() throws InterruptedException, IOException {
 | 
				
			||||||
 | 
					    inferResults =
 | 
				
			||||||
 | 
					      InferResults.loadCheckersResults(ExpensiveInheritanceTest.class, SOURCE_FILE);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  @Test
 | 
				
			||||||
 | 
					  public void matchErrors()
 | 
				
			||||||
 | 
					      throws IOException, InterruptedException, InferException {
 | 
				
			||||||
 | 
					    String[] methods = {
 | 
				
			||||||
 | 
					        "reportsBecauseFooIsExpensiveInA",
 | 
				
			||||||
 | 
					        "reportsAssumingObjectOfTypeA",
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    assertThat(
 | 
				
			||||||
 | 
					        "Results should contain " + CALLS_EXPENSIVE_METHOD,
 | 
				
			||||||
 | 
					        inferResults,
 | 
				
			||||||
 | 
					        containsExactly(
 | 
				
			||||||
 | 
					            CALLS_EXPENSIVE_METHOD,
 | 
				
			||||||
 | 
					            SOURCE_FILE,
 | 
				
			||||||
 | 
					            methods));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue