[Fb-contrib-commit] SF.net SVN: fb-contrib:[1821] trunk/fb-contrib
Brought to you by:
dbrosius
From: <dbr...@us...> - 2017-05-29 20:49:50
|
Revision: 1821 http://sourceforge.net/p/fb-contrib/code/1821 Author: dbrosius Date: 2017-05-29 20:49:46 +0000 (Mon, 29 May 2017) Log Message: ----------- sync from github Modified Paths: -------------- trunk/fb-contrib/.classpath trunk/fb-contrib/build.xml trunk/fb-contrib/etc/bugrank.txt trunk/fb-contrib/etc/findbugs.xml trunk/fb-contrib/etc/findbugsplugin.xsd trunk/fb-contrib/etc/messages.xml trunk/fb-contrib/htdocs/index.shtml trunk/fb-contrib/htdocs/repository.html trunk/fb-contrib/pom.xml trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/collect/CollectStatistics.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/debug/Debug.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/DeletingWhileIterating.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/ImmatureClass.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OptionalIssues.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OverlyPermissiveMethod.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossibleConstantAllocationInLoop.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossiblyRedundantMethodCalls.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/SillynessPotPourri.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/StringifiedTypes.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UnnecessaryApiConversion.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseEnumCollections.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseTryWithResources.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/BugType.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureBuilder.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureUtils.java trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/Values.java trunk/fb-contrib/src/samples/java/ex/IMC_Sample.java trunk/fb-contrib/src/samples/java/ex/PCAIL_Sample.java trunk/fb-contrib/src/samples/java/ex/PRMC_Sample.java trunk/fb-contrib/src/samples/java/ex/SPP_Sample.java trunk/fb-contrib/src/samples/java/ex/STT_Sample.java trunk/fb-contrib/src/test/java/com/mebigfatguy/fbcontrib/utils/SignatureUtilsTest.java Modified: trunk/fb-contrib/.classpath =================================================================== --- trunk/fb-contrib/.classpath 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/.classpath 2017-05-29 20:49:46 UTC (rev 1821) @@ -17,7 +17,7 @@ </classpathentry> <classpathentry kind="lib" path="lib/findbugs-3.0.1.jar" sourcepath="lib/sources/findbugs-3.0.1-sources.jar"/> <classpathentry kind="lib" path="lib/junit-4.12.jar"/> - <classpathentry kind="lib" path="lib/javax.persistence-2.1.1.jar"/> + <classpathentry kind="lib" path="lib/javax.persistence-2.1.1.jar" sourcepath="/home/dave/.m2/repository/org/eclipse/persistence/javax.persistence/2.1.1/javax.persistence-2.1.1-sources.jar"/> <classpathentry kind="lib" path="lib/mockito-all-2.0.2-beta.jar"/> <classpathentry combineaccessrules="false" kind="src" path="/findbugs"/> <classpathentry kind="lib" path="lib/threetenbp-1.3.2.jar"/> Modified: trunk/fb-contrib/build.xml =================================================================== --- trunk/fb-contrib/build.xml 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/build.xml 2017-05-29 20:49:46 UTC (rev 1821) @@ -31,7 +31,7 @@ <property name="javac.debug" value="on" /> <property name="test_reports.dir" value="${target.dir}/reports/test"/> - <property name="fb-contrib.version" value="7.0.1" /> + <property name="fb-contrib.version" value="7.0.2" /> <property name="sonatype.dir" value="${user.home}/.fb-contrib-${fb-contrib.version}-sonatype" /> Modified: trunk/fb-contrib/etc/bugrank.txt =================================================================== --- trunk/fb-contrib/etc/bugrank.txt 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/etc/bugrank.txt 2017-05-29 20:49:46 UTC (rev 1821) @@ -228,6 +228,7 @@ +0 BugPattern STB_STACKED_TRY_BLOCKS +2 BugPattern STS_SPURIOUS_THREAD_STATES +0 BugPattern STT_STRING_PARSING_A_FIELD ++0 BugPattern STT_TOSTRING_MAP_KEYING +0 BugPattern STT_TOSTRING_STORED_IN_FIELD +0 BugPattern SUA_SUSPICIOUS_UNINITIALIZED_ARRAY +0 BugPattern SWCO_SUSPICIOUS_WAIT_ON_CONCURRENT_OBJECT @@ -249,27 +250,27 @@ +0 BugPattern USBR_UNNECESSARY_STORE_BEFORE_RETURN +0 BugPattern USFW_UNSYNCHRONIZED_SINGLETON_FIELD_WRITES +0 BugPattern USS_USE_STRING_SPLIT -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_ACTUAL_CONSTANT -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_ASSERT_USED -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_BOOLEAN_ASSERT -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_IMPOSSIBLE_NULL -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_INEXACT_DOUBLE -+2 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_NO_ASSERT -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_EQUALS -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_NOT_EQUALS -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_NOT_NULL -+0 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_NULL ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_ACTUAL_CONSTANT ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_ASSERT_USED ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_BOOLEAN_ASSERT ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_IMPOSSIBLE_NULL ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_INEXACT_DOUBLE ++1 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_NO_ASSERT ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_EQUALS ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_NOT_EQUALS ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_NOT_NULL ++3 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USE_ASSERT_NULL +1 BugPattern UTAO_JUNIT_ASSERTION_ODDITIES_USING_DEPRECATED -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_ACTUAL_CONSTANT -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_ASSERT_USED -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_BOOLEAN_ASSERT -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_IMPOSSIBLE_NULL -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_INEXACT_DOUBLE -+2 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_NO_ASSERT -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_EQUALS -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_NOT_EQUALS -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_NOT_NULL -+0 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_NULL ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_ACTUAL_CONSTANT ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_ASSERT_USED ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_BOOLEAN_ASSERT ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_IMPOSSIBLE_NULL ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_INEXACT_DOUBLE ++1 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_NO_ASSERT ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_EQUALS ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_NOT_EQUALS ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_NOT_NULL ++3 BugPattern UTAO_TESTNG_ASSERTION_ODDITIES_USE_ASSERT_NULL +0 BugPattern UTA_USE_TO_ARRAY +0 BugPattern UTWR_USE_TRY_WITH_RESOURCES +0 BugPattern UVA_USE_VAR_ARGS Modified: trunk/fb-contrib/etc/findbugs.xml =================================================================== --- trunk/fb-contrib/etc/findbugs.xml 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/etc/findbugs.xml 2017-05-29 20:49:46 UTC (rev 1821) @@ -20,7 +20,7 @@ <!-- Detectors --> -<!-- COMMENT OUT FOR RELEASE +<!-- COMMENT OUT FOR RELEASE <Detector class="com.mebigfatguy.fbcontrib.debug.OCSDebugger" speed="fast"/> @@ -30,7 +30,7 @@ <Detector class="com.mebigfatguy.fbcontrib.detect.BloatedAssignmentScope" speed="fast" reports="BAS_BLOATED_ASSIGNMENT_SCOPE" hidden="true" /> - COMMENT OUT FOR RELEASE --> + COMMENT OUT FOR RELEASE --> <Detector class="com.mebigfatguy.fbcontrib.collect.CollectStatistics" speed="fast" reports="" hidden="true" /> @@ -283,7 +283,7 @@ <Detector class="com.mebigfatguy.fbcontrib.detect.OverlyPermissiveMethod" speed="fast" reports="OPM_OVERLY_PERMISSIVE_METHOD" /> - <Detector class="com.mebigfatguy.fbcontrib.detect.StringifiedTypes" speed="fast" reports="STT_STRING_PARSING_A_FIELD,STT_TOSTRING_STORED_IN_FIELD" /> + <Detector class="com.mebigfatguy.fbcontrib.detect.StringifiedTypes" speed="fast" reports="STT_STRING_PARSING_A_FIELD,STT_TOSTRING_STORED_IN_FIELD,STT_TOSTRING_MAP_KEYING" /> <Detector class="com.mebigfatguy.fbcontrib.detect.ImmatureClass" speed="moderate" reports="IMC_IMMATURE_CLASS_NO_EQUALS,IMC_IMMATURE_CLASS_NO_HASHCODE,IMC_IMMATURE_CLASS_NO_PACKAGE,IMC_IMMATURE_CLASS_NO_TOSTRING,IMC_IMMATURE_CLASS_IDE_GENERATED_PARAMETER_NAMES,IMC_IMMATURE_CLASS_PRINTSTACKTRACE,IMC_IMMATURE_CLASS_WRONG_FIELD_ORDER" /> @@ -311,13 +311,13 @@ <Detector class="com.mebigfatguy.fbcontrib.detect.OptionalIssues" speed="fast" reports="OI_OPTIONAL_ISSUES_USES_IMMEDIATE_EXECUTION,OI_OPTIONAL_ISSUES_USES_DELAYED_EXECUTION,OI_OPTIONAL_ISSUES_CHECKING_REFERENCE,OI_OPTIONAL_ISSUES_PRIMITIVE_VARIANT_PREFERRED"/> - <Detector class="com.mebigfatguy.fbcontrib.detect.UnnecessaryApiConversion" speed="fast" reports="UAC_UNNECESSARY_API_CONVERSION_DATE_TO_INSTANT"/> + <Detector class="com.mebigfatguy.fbcontrib.detect.UnnecessaryApiConversion" speed="fast" reports="UAC_UNNECESSARY_API_CONVERSION_DATE_TO_INSTANT,UAC_UNNECESSARY_API_CONVERSION_FILE_TO_PATH"/> <!-- COMMENT OUT FOR POINT RELEASE <Detector class="com.mebigfatguy.fbcontrib.detect.UseTryWithResources" speed="fast" reports="UTWR_USE_TRY_WITH_RESOURCES"/> - COMMENT OUT FOR POINT RELEASE --> + COMMENT OUT FOR POINT RELEASE --> <!-- BugPattern --> @@ -561,6 +561,7 @@ <BugPattern abbrev="OPM" type="OPM_OVERLY_PERMISSIVE_METHOD" category="STYLE" /> <BugPattern abbrev="STT" type="STT_STRING_PARSING_A_FIELD" category="STYLE" /> <BugPattern abbrev="STT" type="STT_TOSTRING_STORED_IN_FIELD" category="STYLE" /> + <BugPattern abbrev="STT" type="STT_TOSTRING_MAP_KEYING" category="STYLE" /> <BugPattern abbrev="SLS" type="SLS_SUSPICIOUS_LOOP_SEARCH" category="CORRECTNESS" /> <BugPattern abbrev="CRF" type="CRF_CONFLATING_RESOURCES_AND_FILES" category="CORRECTNESS" /> <BugPattern abbrev="IMC" type="IMC_IMMATURE_CLASS_IDE_GENERATED_PARAMETER_NAMES" category="STYLE" /> @@ -584,7 +585,7 @@ <BugPattern abbrev="SEO" type="SEO_SUBOPTIMAL_EXPRESSION_ORDER" category="PERFORMANCE"/> <BugPattern abbrev="IOI" type="IOI_DOUBLE_BUFFER_COPY" category="PERFORMANCE"/> <BugPattern abbrev="IOI" type="IOI_COPY_WITH_READER" category="PERFORMANCE"/> - <BugPattern abbrev="IOI" type="IOI_USE_OF_FILE_STREAM_CONSTRUCTORS"/> + <BugPattern abbrev="IOI" type="IOI_USE_OF_FILE_STREAM_CONSTRUCTORS" category="PERFORMANCE"/> <BugPattern abbrev="DMC" type="DMC_DUBIOUS_MAP_COLLECTION" category="CORRECTNESS"/> <BugPattern abbrev="BL" type="BL_BURYING_LOGIC" category="STYLE"/> <BugPattern abbrev="WI" type="WI_DUPLICATE_WIRED_TYPES" category="CORRECTNESS"/> Modified: trunk/fb-contrib/etc/findbugsplugin.xsd =================================================================== --- trunk/fb-contrib/etc/findbugsplugin.xsd 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/etc/findbugsplugin.xsd 2017-05-29 20:49:46 UTC (rev 1821) @@ -22,7 +22,7 @@ <xsd:simpleType name="IdentifierType"> <xsd:restriction base="xsd:string"> - <xsd:pattern value="[A-Za-z0-9_]*"/> + <xsd:pattern value="[A-Za-z0-9_]+"/> </xsd:restriction> </xsd:simpleType> Modified: trunk/fb-contrib/etc/messages.xml =================================================================== --- trunk/fb-contrib/etc/messages.xml 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/etc/messages.xml 2017-05-29 20:49:46 UTC (rev 1821) @@ -5310,6 +5310,36 @@ </Details> </BugPattern> + <BugPattern type="STT_TOSTRING_MAP_KEYING"> + <ShortDescription>This method uses a concatenated String as a map key</ShortDescription> + <LongDescription>This method {1} uses a concatenated String as a map key</LongDescription> + <Details> + <![CDATA[ + <p>This method builds a key for a map, using a StringBuilder, either implicitly or explicitly. This means the type + of the key is something more t han a String constant, it is a properly formatted String. However, there is no + type based verification that all uses of this key will follow this formatting. It is much better to use a proper, simple, + bean class that holds two (or more fields) so that it is clear what is expected for key use. + </p> + <p> + Example<br/> + instead of + {@code + V v = myMap.get(tableName + "-" + columnName); + } + use + {@code + V v = myMap.get(new ColumnSpec(tableName, columnName)); + } + where ColumnSpec is a simple bean-like class of your creation. The advantages, are + <ul> + <li>The ColumnSpec fully describes what is expected, you need a tableName and columnName</li> + <li>There is no guessing by the programmer what the format is, was it tableName + "_" + columnName?</li> + </ul> + </p> + ]]> + </Details> + </BugPattern> + <BugPattern type="SLS_SUSPICIOUS_LOOP_SEARCH"> <ShortDescription>This method continues a loop after finding an equality condition</ShortDescription> <LongDescription>This method {1} continues a loop after finding an equality condition</LongDescription> Modified: trunk/fb-contrib/htdocs/index.shtml =================================================================== --- trunk/fb-contrib/htdocs/index.shtml 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/htdocs/index.shtml 2017-05-29 20:49:46 UTC (rev 1821) @@ -68,7 +68,7 @@ </li> </ul> </p> - <p style="font-weight: bold;">The latest version of fb-contrib is 7.0.1 available for download + <p style="font-weight: bold;">The latest version of fb-contrib is 7.0.2 available for download <a href="http://search.maven.org/#search%7Cga%7C1%7Ca%3A%22fb-contrib%22">here</a>.</p> <p style="font-weight: bold;">This version requires FindBugs 3.0.1 or better</p> <p style="font-weight: bold;">Please note that active development for this project is now done on Modified: trunk/fb-contrib/htdocs/repository.html =================================================================== --- trunk/fb-contrib/htdocs/repository.html 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/htdocs/repository.html 2017-05-29 20:49:46 UTC (rev 1821) @@ -22,7 +22,7 @@ <table style="margin-left: 40px; background-color: #A0A0FF; padding: 20px; border-width: 1px; border-style: outset; border-color: #000000;"> <tr><td><b>GroupId:</b></td><td>com.mebigfatguy.fb-contrib</td></tr> <tr><td><b>ArtifactId:</b></td><td>fb-contrib</td></tr> - <tr><td><b>Version:</b></td><td>7.0.1</td></tr> + <tr><td><b>Version:</b></td><td>7.0.2</td></tr> </table> </div> Modified: trunk/fb-contrib/pom.xml =================================================================== --- trunk/fb-contrib/pom.xml 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/pom.xml 2017-05-29 20:49:46 UTC (rev 1821) @@ -8,7 +8,7 @@ <modelVersion>4.0.0</modelVersion> <groupId>com.mebigfatguy.fb-contrib</groupId> <artifactId>fb-contrib</artifactId> - <version>7.0.1</version> + <version>7.0.2</version> <prerequisites> <maven>2.2.1</maven> Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/collect/CollectStatistics.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/collect/CollectStatistics.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/collect/CollectStatistics.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -71,6 +71,8 @@ * @param bugReporter * unused, but required by reflection contract */ + // required for reflection + @SuppressWarnings("PMD.UnusedFormalParameter") public CollectStatistics(BugReporter bugReporter) { Statistics.getStatistics().clear(); } Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/debug/Debug.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/debug/Debug.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/debug/Debug.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -20,11 +20,12 @@ package com.mebigfatguy.fbcontrib.debug; import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; public final class Debug { @@ -33,7 +34,7 @@ static { try { out = new PrintStream( - new BufferedOutputStream(new FileOutputStream(new File(System.getProperty("java.io.tmpdir"), "fb-contrib.txt").getPath(), true)), false, + new BufferedOutputStream(Files.newOutputStream(Paths.get(System.getProperty("java.io.tmpdir"), "fb-contrib.txt"), StandardOpenOption.APPEND)), false, StandardCharsets.UTF_8.name()); out.println("===== fb-contrib console ====="); } catch (IOException e) { Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/DeletingWhileIterating.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/DeletingWhileIterating.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/DeletingWhileIterating.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -446,23 +446,24 @@ } Comparable<?> groupElement = getGroupElement(itm); - if (groupElement != null) { - int numGroups = collectionGroups.size(); - for (int i = 0; i < numGroups; i++) { - GroupPair groupPair = collectionGroups.get(i); - if (groupPair.containsMember(groupElement)) { - return i; - } + if (groupElement == null) { + return -1; + } + int numGroups = collectionGroups.size(); + for (int i = 0; i < numGroups; i++) { + GroupPair groupPair = collectionGroups.get(i); + if (groupPair.containsMember(groupElement)) { + return i; } + } - if (addIfNotFound) { - GroupPair groupPair = new GroupPair(groupElement, itm.getSignature()); - collectionGroups.add(groupPair); - return collectionGroups.size() - 1; - } + if (!addIfNotFound) { + return -1; } - return -1; + GroupPair groupPair = new GroupPair(groupElement, itm.getSignature()); + collectionGroups.add(groupPair); + return collectionGroups.size() - 1; } private void removeFromCollectionGroup(OpcodeStack.Item itm) { Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/ImmatureClass.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/ImmatureClass.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/ImmatureClass.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -42,6 +42,7 @@ private BugReporter bugReporter; private FieldStatus fieldStatus = FieldStatus.NONE; + private boolean classIsJPAEntity; public ImmatureClass(BugReporter reporter) { bugReporter = reporter; @@ -66,6 +67,11 @@ try { boolean clsHasRuntimeAnnotation = classHasRuntimeVisibleAnnotation(cls); + if (clsHasRuntimeAnnotation) { + classIsJPAEntity = classIsJPAEntity(cls); + } else { + classIsJPAEntity = false; + } HEStatus heStatus = HEStatus.UNKNOWN; checkIDEGeneratedParmNames(cls); @@ -76,7 +82,7 @@ boolean fieldHasRuntimeAnnotation = fieldHasRuntimeVisibleAnnotation(f); if (!fieldHasRuntimeAnnotation) { /* only report one of these, so as not to flood the report */ - if (!hasMethodInHierarchy(cls, Values.TOSTRING, SignatureBuilder.SIG_VOID_TO_STRING)) { + if (!classIsJPAEntity && !hasMethodInHierarchy(cls, Values.TOSTRING, SignatureBuilder.SIG_VOID_TO_STRING)) { bugReporter.reportBug(new BugInstance(this, BugType.IMC_IMMATURE_CLASS_NO_TOSTRING.name(), LOW_PRIORITY).addClass(cls)); heStatus = HEStatus.NOT_NEEDED; break; @@ -206,6 +212,26 @@ } /** + * returns whether this class is a JPA Entity, as such it shouldn't really have a toString() + * + * @param cls + * the class to check + * @return if the class is a jpa entity + */ + private static boolean classIsJPAEntity(JavaClass cls) { + AnnotationEntry[] annotations = cls.getAnnotationEntries(); + if (annotations != null) { + for (AnnotationEntry annotation : annotations) { + if ("Ljavax/persistence/Entity;".equals(annotation.getAnnotationType())) { + return true; + } + } + } + + return false; + } + + /** * looks to see the field has a runtime visible annotation, if it does it might be autowired or some other mechanism attached that makes them less * interesting for a toString call. * Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OptionalIssues.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OptionalIssues.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OptionalIssues.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -261,6 +261,10 @@ if (invokeCount == 1) { FQMethod method = activeStackOps.getLast().getMethod(); + if (method == null) { + return false; + } + if ("valueOf".equals(method.getMethodName()) && method.getClassName().startsWith("java/lang/")) { return true; } Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OverlyPermissiveMethod.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OverlyPermissiveMethod.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/OverlyPermissiveMethod.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -376,7 +376,9 @@ } } } else { - throw new RuntimeException("Incompatible bcel version"); + throw new RuntimeException( + "Incompatible bcel version, apparently bcel has been upgraded to not use 'Unknown' for 'BootstrapMethods', but uses: " + + a.getName()); } return null; } Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossibleConstantAllocationInLoop.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossibleConstantAllocationInLoop.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossibleConstantAllocationInLoop.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -62,6 +62,7 @@ private Map<Integer, Integer> storedAllocations; private int nextAllocationNumber; private List<SwitchInfo> switchInfos; + private int nextTernaryTarget; public PossibleConstantAllocationInLoop(BugReporter bugReporter) { this.bugReporter = bugReporter; @@ -89,6 +90,7 @@ allocations.clear(); storedAllocations.clear(); nextAllocationNumber = 1; + nextTernaryTarget = -1; super.visitCode(obj); for (AllocationInfo info : allocations.values()) { @@ -106,9 +108,30 @@ Integer sawAllocationNumber = null; try { + if ((nextTernaryTarget == getPC()) && (stack.getStackDepth() > 0)) { + OpcodeStack.Item itm = stack.getStackItem(0); + sawAllocationNumber = (Integer) itm.getUserValue(); + sawAllocation = sawAllocationNumber != null; + nextTernaryTarget = -1; + } + stack.precomputation(this); + if ((sawAllocation) && (stack.getStackDepth() > 0)) { + OpcodeStack.Item itm = stack.getStackItem(0); + itm.setUserValue(sawAllocationNumber); + sawAllocationNumber = null; + sawAllocation = false; + } + switch (seen) { + case GOTO: + case GOTO_W: + if ((getBranchOffset() > 0) && (stack.getStackDepth() > 0)) { + // ternary + nextTernaryTarget = getBranchTarget(); + } + // $FALL-THROUGH$ case IFEQ: case IFNE: case IFLT: @@ -125,8 +148,7 @@ case IF_ACMPNE: case IFNULL: case IFNONNULL: - case GOTO: - case GOTO_W: + processBranch(); break; @@ -144,6 +166,7 @@ case INVOKEINTERFACE: case INVOKEVIRTUAL: case INVOKESTATIC: + case INVOKEDYNAMIC: String signature = getSigConstantOperand(); int numParameters = SignatureUtils.getNumParameters(signature); if (stack.getStackDepth() >= numParameters) { @@ -154,7 +177,7 @@ allocations.remove(allocation); } } - if (((seen == INVOKEINTERFACE) || (seen == INVOKEVIRTUAL) || (seen == INVOKESPECIAL)) + if (((seen == INVOKEINTERFACE) || (seen == INVOKEVIRTUAL) || (seen == INVOKESPECIAL) || (seen == INVOKEDYNAMIC)) // ignore possible method chaining && (stack.getStackDepth() > numParameters)) { OpcodeStack.Item item = stack.getStackItem(numParameters); Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossiblyRedundantMethodCalls.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossiblyRedundantMethodCalls.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/PossiblyRedundantMethodCalls.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -34,9 +34,11 @@ import com.mebigfatguy.fbcontrib.collect.MethodInfo; import com.mebigfatguy.fbcontrib.collect.Statistics; import com.mebigfatguy.fbcontrib.utils.BugType; +import com.mebigfatguy.fbcontrib.utils.FQMethod; import com.mebigfatguy.fbcontrib.utils.RegisterUtils; import com.mebigfatguy.fbcontrib.utils.SignatureUtils; import com.mebigfatguy.fbcontrib.utils.ToString; +import com.mebigfatguy.fbcontrib.utils.UnmodifiableSet; import com.mebigfatguy.fbcontrib.utils.Values; import edu.umd.cs.findbugs.BugInstance; @@ -151,6 +153,27 @@ } } + private static final Set<FQMethod> commonMethods = UnmodifiableSet.create( + // @formatter:off + new FQMethod("java/lang/Boolean", "valueOf", "(Z)Ljava/lang/Boolean;"), + new FQMethod("java/lang/Byte", "valueOf", "(B)Ljava/lang/Byte;"), + new FQMethod("java/lang/Character", "valueOf", "(C)Ljava/lang/Character;"), + new FQMethod("java/lang/Short", "valueOf", "(S)Ljava/lang/Short;"), + new FQMethod("java/lang/Integer", "valueOf", "(I)Ljava/lang/Integer;"), + new FQMethod("java/lang/Long", "valueOf", "(J)Ljava/lang/Long;"), + new FQMethod("java/lang/Float", "valueOf", "(F)Ljava/lang/Float;"), + new FQMethod("java/lang/Double", "valueOf", "(D)Ljava/lang/Double;"), + new FQMethod("java/lang/Boolean", "booleanValue", "()Z"), + new FQMethod("java/lang/Byte", "byteValue", "()B"), + new FQMethod("java/lang/Character", "charValue", "()C"), + new FQMethod("java/lang/Short", "shortValue", "()S"), + new FQMethod("java/lang/Integer", "intValue", "()I"), + new FQMethod("java/lang/Long", "longValue", "()J"), + new FQMethod("java/lang/Float", "floatValue", "()F"), + new FQMethod("java/lang/Double", "doubleValue", "()D") + // @formatter:on + ); + private final BugReporter bugReporter; private OpcodeStack stack = null; private Map<Integer, MethodCall> localMethodCalls = null; @@ -347,7 +370,8 @@ if (mc != null) { if (!signature.endsWith(Values.SIG_VOID) && methodName.equals(mc.getName()) && signature.equals(mc.getSignature()) - && !isRiskyName(className, methodName)) { + && !isRiskyName(className, methodName) + && !commonMethods.contains(new FQMethod(getClassConstantOperand(), methodName, signature))) { Object[] parms = mc.getParms(); if (Arrays.equals(parms, parmConstants)) { int ln = getLineNumber(pc); Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/SillynessPotPourri.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/SillynessPotPourri.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/SillynessPotPourri.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -972,7 +972,7 @@ Object o = item.getConstant(); if (o instanceof Integer) { int parm = ((Integer) o).intValue(); - if ((parm > 32) && (parm < 127) && (parm != 64) && ((parm % 10) != 0) && ((parm % 5) != 0)) { + if ((parm > 32) && (parm < 127) && (parm != 64) && (parm != 48) && ((parm % 5) != 0)) { bugReporter.reportBug(new BugInstance(this, BugType.SPP_NO_CHAR_SB_CTOR.name(), LOW_PRIORITY).addClass(this).addMethod(this) .addSourceLine(this)); } Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/StringifiedTypes.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/StringifiedTypes.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/StringifiedTypes.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -37,6 +37,7 @@ import edu.umd.cs.findbugs.OpcodeStack; import edu.umd.cs.findbugs.OpcodeStack.CustomUserValue; import edu.umd.cs.findbugs.ba.ClassContext; +import edu.umd.cs.findbugs.ba.XMethod; /** * looks for string fields that appear to be built with parsing or calling toString() on another object, or from objects that are fields. @@ -88,6 +89,8 @@ } private static final String FROM_FIELD = "FROM_FIELD"; + private static final FQMethod MAP_PUT = new FQMethod(Values.SLASHED_JAVA_UTIL_MAP, "put", SignatureBuilder.SIG_TWO_OBJECTS_TO_OBJECT); + private BugReporter bugReporter; private OpcodeStack stack; private BitSet toStringStringBuilders; @@ -190,7 +193,16 @@ if (checkParms != null) { OpcodeStack.Item item = stack.getStackItem(numParameters); if (item.getXField() == null) { - checkParms = null; + if (MAP_PUT.equals(cm)) { + OpcodeStack.Item itm = stack.getStackItem(1); + XMethod xm = itm.getReturnValueOf(); + if (xm != null) { + if (Values.DOTTED_JAVA_LANG_STRINGBUILDER.equals(xm.getClassName())) { + bugReporter.reportBug(new BugInstance(this, BugType.STT_TOSTRING_MAP_KEYING.name(), NORMAL_PRIORITY).addClass(this) + .addMethod(this).addSourceLine(this)); + } + } + } } else { for (int parm : checkParms) { if ((parm >= 0) && Values.TOSTRING.equals(stack.getStackItem(parm).getUserValue())) { Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UnnecessaryApiConversion.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UnnecessaryApiConversion.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UnnecessaryApiConversion.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -90,6 +90,9 @@ } } break; + + default: + break; } } finally { stack.sawOpcode(this, seen); Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseEnumCollections.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseEnumCollections.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseEnumCollections.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -223,11 +223,7 @@ // If the cls implements any interface, it's possible the collection // is based on that interface, so ignore - if (cls.getInterfaces().length == 0) { - return true; - } - - return false; + return cls.getInterfaces().length == 0; } /** Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseTryWithResources.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseTryWithResources.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/detect/UseTryWithResources.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -59,6 +59,7 @@ private int lastNullCheckedReg; private int bugPC; private int closePC; + private int suppressedPC; private State state; public UseTryWithResources(BugReporter bugReporter) { @@ -105,12 +106,23 @@ lastNullCheckedReg = -1; bugPC = -1; closePC = -1; + suppressedPC = -1; super.visitCode(obj); + + if ((closePC >= 0) && (suppressedPC < 0)) { + bugReporter.reportBug(new BugInstance(this, BugType.UTWR_USE_TRY_WITH_RESOURCES.name(), NORMAL_PRIORITY).addClass(this).addMethod(this) + .addSourceLine(this, bugPC)); + } } } @Override public void sawOpcode(int seen) { + + if (suppressedPC >= 0) { + return; + } + try { int pc = getPC(); Iterator<TryBlock> it = finallyBlocks.values().iterator(); @@ -127,13 +139,6 @@ } } - if ((closePC >= 0) && (closePC <= pc)) { - bugReporter.reportBug(new BugInstance(this, BugType.UTWR_USE_TRY_WITH_RESOURCES.name(), NORMAL_PRIORITY).addClass(this).addMethod(this) - .addSourceLine(this, bugPC)); - closePC = -1; - bugPC = -1; - } - if (OpcodeUtils.isAStore(seen)) { regStoredPCs.put(Integer.valueOf(getRegisterOperand()), Integer.valueOf(pc)); } @@ -169,11 +174,12 @@ lastNullCheckedReg = -1; } - if ((((bugPC >= 0) && (seen == INVOKEVIRTUAL)) || (seen == INVOKEINTERFACE)) && "addSuppressed".equals(getNameConstantOperand()) + if ((bugPC >= 0) && ((seen == INVOKEVIRTUAL) || (seen == INVOKEINTERFACE)) && "addSuppressed".equals(getNameConstantOperand()) && SignatureBuilder.SIG_THROWABLE_TO_VOID.equals(getSigConstantOperand()) && Repository.lookupClass(getClassConstantOperand()).instanceOf(throwableClass)) { closePC = -1; bugPC = -1; + suppressedPC = getPC(); } } Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/BugType.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/BugType.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/BugType.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -266,6 +266,7 @@ STB_STACKED_TRY_BLOCKS, STS_SPURIOUS_THREAD_STATES, STT_STRING_PARSING_A_FIELD, + STT_TOSTRING_MAP_KEYING, STT_TOSTRING_STORED_IN_FIELD, SUA_SUSPICIOUS_UNINITIALIZED_ARRAY, SWCO_SUSPICIOUS_WAIT_ON_CONCURRENT_OBJECT, Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureBuilder.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureBuilder.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureBuilder.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -122,7 +122,7 @@ public SignatureBuilder withReturnType(String type) { if ((type == null) || (type.length() == 0)) { - throw new IllegalArgumentException("Missing return type; did you mean 'withoutReturnType'?"); + throw new IllegalArgumentException("Missing return type; did you mean 'withoutReturnType'? -- " + this); } returnType = SignatureUtils.classToSignature(type); return this; @@ -130,7 +130,7 @@ public SignatureBuilder withReturnType(Class<?> type) { if (type == null) { - throw new IllegalArgumentException("Missing return type; did you mean 'withoutReturnType'?"); + throw new IllegalArgumentException("Missing return type; did you mean 'withoutReturnType'? -- " + this); } return withReturnType(type.getName()); } Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureUtils.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureUtils.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/SignatureUtils.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -208,6 +208,7 @@ i = semiPos; } else if (isWonkyEclipseSignature(methodSignature, i)) { sigStart++; + continue; } else { parmSignature = methodSignature.substring(sigStart, i + 1); slotIndexToParms.put(Integer.valueOf(slot), parmSignature); @@ -244,9 +245,7 @@ int semiPos = methodSignature.indexOf(Values.SIG_QUALIFIED_CLASS_SUFFIX_CHAR, i + 1); parmSignatures.add(methodSignature.substring(sigStart, semiPos + 1)); i = semiPos; - } else if (isWonkyEclipseSignature(methodSignature, i)) { - sigStart++; - } else { + } else if (!isWonkyEclipseSignature(methodSignature, i)) { parmSignatures.add(methodSignature.substring(sigStart, i + 1)); } sigStart = i + 1; Modified: trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/Values.java =================================================================== --- trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/Values.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/main/java/com/mebigfatguy/fbcontrib/utils/Values.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -75,6 +75,8 @@ public static final String DOTTED_JAVA_LANG_ERROR = "java.lang.Error"; @DottedClassName public static final String DOTTED_JAVA_LANG_INTEGER = "java.lang.Integer"; + @DottedClassName + public static final String DOTTED_JAVA_LANG_STRINGBUILDER = "java.lang.StringBuilder"; @SlashedClassName public static final String SLASHED_JAVA_LANG_OBJECT = "java/lang/Object"; Modified: trunk/fb-contrib/src/samples/java/ex/IMC_Sample.java =================================================================== --- trunk/fb-contrib/src/samples/java/ex/IMC_Sample.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/samples/java/ex/IMC_Sample.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -9,6 +9,8 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import javax.persistence.Entity; + import org.junit.Assert; import org.junit.Test; import org.objectweb.asm.AnnotationVisitor; @@ -64,6 +66,12 @@ } } +@Entity +class FPIMCEntity { + private int id; + private String name; +} + class MyVisitor extends AnnotationVisitor { String name; Modified: trunk/fb-contrib/src/samples/java/ex/PCAIL_Sample.java =================================================================== --- trunk/fb-contrib/src/samples/java/ex/PCAIL_Sample.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/samples/java/ex/PCAIL_Sample.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -1,8 +1,11 @@ package ex; import java.net.URL; import java.util.ArrayList; +import java.util.Collections; +import java.util.Deque; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.TreeSet; @@ -154,6 +157,16 @@ fooList.add(foo); } } + + public void fpLambdaWithTernary(Deque<String> stack, Map<String, List<String>> details) { + while (!stack.isEmpty()) { + String s = stack.pop(); + List<String> detail = details.get(s); + detail = detail != null ? detail : new ArrayList<String>(); + Collections.reverse(detail); + detail.forEach(stack::push); + } + } private PCAIL_Sample builder() { return this; Modified: trunk/fb-contrib/src/samples/java/ex/PRMC_Sample.java =================================================================== --- trunk/fb-contrib/src/samples/java/ex/PRMC_Sample.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/samples/java/ex/PRMC_Sample.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -1,4 +1,5 @@ package ex; + import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.Arrays; @@ -140,7 +141,7 @@ System.out.println(foo.toString()); } } - + public void fpWithGenericReturn() { Set<String> s = ImmutableSet.of(); Set<Integer> i = ImmutableSet.of(); @@ -150,6 +151,17 @@ throw new RuntimeException("kaboom!"); } + public void fpIgnoreCommonBoxing(Integer i) { + setTwo(i, i); + setTwo(3.1, 3.1); + } + + public void setTwo(int i, int j) { + } + + public void setTwo(Double d, Double e) { + } + public void setValue(int i) { } Modified: trunk/fb-contrib/src/samples/java/ex/SPP_Sample.java =================================================================== --- trunk/fb-contrib/src/samples/java/ex/SPP_Sample.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/samples/java/ex/SPP_Sample.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -1,4 +1,5 @@ package ex; + import java.io.Serializable; import java.lang.reflect.Array; import java.math.BigDecimal; @@ -31,6 +32,7 @@ private static final double e = 2.72; public static final String FALSE_POSITIVE = "INTERN_OK_HERE".intern(); private static final String LIT = "lit"; + private static final int BIG_SIZE = 48; static enum Flap { Smack, Jack @@ -435,6 +437,10 @@ sqlQuery.setString(1, name + "%"); } } + + public void fpIssue199SBWithNum() { + StringBuilder sb = new StringBuilder(BIG_SIZE); + } } interface FPInterfaceWithSerialVer extends Serializable { Modified: trunk/fb-contrib/src/samples/java/ex/STT_Sample.java =================================================================== --- trunk/fb-contrib/src/samples/java/ex/STT_Sample.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/samples/java/ex/STT_Sample.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -1,4 +1,5 @@ package ex; + import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -36,6 +37,12 @@ return s.substring(0, colonPos); } + public Map<String, String> testLocalMapKeyedByStringifiedType(String a, String b) { + Map<String, String> s = new HashMap<>(); + s.put(a + b, b + a); + return s; + } + public void fpTestToStringToFieldSB(String s) { val = s + "wow"; } Modified: trunk/fb-contrib/src/test/java/com/mebigfatguy/fbcontrib/utils/SignatureUtilsTest.java =================================================================== --- trunk/fb-contrib/src/test/java/com/mebigfatguy/fbcontrib/utils/SignatureUtilsTest.java 2017-04-22 21:28:01 UTC (rev 1820) +++ trunk/fb-contrib/src/test/java/com/mebigfatguy/fbcontrib/utils/SignatureUtilsTest.java 2017-05-29 20:49:46 UTC (rev 1821) @@ -75,11 +75,24 @@ } @Test + public void shouldGetParameterSlotsAndSignaturesForWonkyEclipseMethod() { + Map<Integer, String> expected = new HashMap<>(2); + expected.put(0, "I"); + expected.put(1, "Ljava/util/List;"); + assertEquals(SignatureUtils.getParameterSlotAndSignatures(true, "add(I!+Ljava/util/List;)Ljava/lang/Object;"), expected); + } + + @Test public void shouldGetParameterSignatures() { assertEquals(SignatureUtils.getParameterSignatures("add(ILjava/lang/Object;)Ljava/lang/Object;"), Arrays.asList("I", "Ljava/lang/Object;")); } @Test + public void shouldGetParameterSignaturesWithWonkyEclipseMethod() { + assertEquals(SignatureUtils.getParameterSignatures("add(I!+Ljava/util/List;)Ljava/lang/Object;"), Arrays.asList("I", "Ljava/util/List;")); + } + + @Test public void shouldCountParameterSignatures() { assertEquals(SignatureUtils.getNumParameters("add(ILjava/lang/Object;)Ljava/lang/Object;"), 2); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |