diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/ConvertOctalLiteralToDecimalFix.java b/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/ConvertOctalLiteralToDecimalFix.java index 3500d7b87cc8..f4ef84b015af 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/ConvertOctalLiteralToDecimalFix.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/ConvertOctalLiteralToDecimalFix.java @@ -17,10 +17,7 @@ package com.siyeh.ig.numeric; import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; -import com.intellij.psi.JavaPsiFacade; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiElementFactory; -import com.intellij.psi.PsiExpression; +import com.intellij.psi.*; import com.intellij.util.IncorrectOperationException; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.InspectionGadgetsFix; @@ -39,12 +36,15 @@ class ConvertOctalLiteralToDecimalFix protected void doFix(Project project, ProblemDescriptor descriptor) throws IncorrectOperationException { final PsiElement element = descriptor.getPsiElement(); - final String text = element.getText(); - final int number = Integer.parseInt(text, 8); + if (!(element instanceof PsiLiteralExpression)) return; + + final Object value = ((PsiLiteralExpression)element).getValue(); + if (value == null) return; + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); final PsiElementFactory factory = psiFacade.getElementFactory(); final PsiExpression decimalNumber = - factory.createExpressionFromText(Integer.toString(number), + factory.createExpressionFromText(value.toString(), element); element.replace(decimalNumber); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/OctalLiteralInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/OctalLiteralInspection.java index 634e06e744d5..57bbc71626e7 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/OctalLiteralInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/OctalLiteralInspection.java @@ -20,11 +20,12 @@ import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; import com.siyeh.ig.InspectionGadgetsFix; +import org.intellij.lang.annotations.Pattern; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; public class OctalLiteralInspection extends BaseInspection { - + @Pattern(VALID_ID_PATTERN) @Override @NotNull public String getID() { @@ -77,13 +78,17 @@ public class OctalLiteralInspection extends BaseInspection { return; } @NonNls final String text = literal.getText(); - if ("0".equals(text) || "0L".equals(text) || "0l".equals(text)) { + if (text.length() == 1) { return; } if (text.charAt(0) != '0') { return; } - if (text.startsWith("0x") || text.startsWith("0X")) { + final char c1 = text.charAt(1); + if (c1 != '_' && (c1 < '0' || c1 > '7')) { + return; + } + if (literal.getValue() == null) { return; } registerError(literal); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/RemoveLeadingZeroFix.java b/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/RemoveLeadingZeroFix.java index 702493645fd4..053174221c35 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/RemoveLeadingZeroFix.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/numeric/RemoveLeadingZeroFix.java @@ -44,7 +44,7 @@ class RemoveLeadingZeroFix extends InspectionGadgetsFix { return; } int index = 0; - while (index < max && text.charAt(index) == '0') { + while (index < max && (text.charAt(index) == '0' || text.charAt(index) == '_')) { index++; } final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal1.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal1.after.java new file mode 100644 index 000000000000..bf57d70fda90 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal1.after.java @@ -0,0 +1,3 @@ +class C { + int i = 511; +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal1.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal1.java new file mode 100644 index 000000000000..2046fc7d7537 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal1.java @@ -0,0 +1,3 @@ +class C { + int i = 0777; +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal2.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal2.after.java new file mode 100644 index 000000000000..bf57d70fda90 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal2.after.java @@ -0,0 +1,3 @@ +class C { + int i = 511; +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal2.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal2.java new file mode 100644 index 000000000000..a1fcc85eb8c9 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/ConvertToDecimal2.java @@ -0,0 +1,3 @@ +class C { + int i = 0_7_7_7; +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/RemoveLeadingZero.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/RemoveLeadingZero.after.java new file mode 100644 index 000000000000..f4247c2fa94e --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/RemoveLeadingZero.after.java @@ -0,0 +1,3 @@ +class C { + int i = 7_7_7; +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/RemoveLeadingZero.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/RemoveLeadingZero.java new file mode 100644 index 000000000000..888467311e11 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/numeric/octal/RemoveLeadingZero.java @@ -0,0 +1,3 @@ +class C { + int i = 0__7_7_7; +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/octal_inspection/OctalRecognition.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/octal_inspection/OctalRecognition.java new file mode 100644 index 000000000000..23f9c19f267a --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/octal_inspection/OctalRecognition.java @@ -0,0 +1,11 @@ +public class OctalRecognition { + public void f() { + int i1 = 0123; + int i2 = 0_123; + + int i3 = 0; + int i4 = 7; + int i5 = 0x0123; + int i6 = 0b0101; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/octal_inspection/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/octal_inspection/expected.xml new file mode 100644 index 000000000000..c526d96827de --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/numeric/octal_inspection/expected.xml @@ -0,0 +1,16 @@ + + + + OctalRecognition.java + 3 + Octal integer + Octal integer <code>0123</code> #loc + + + + OctalRecognition.java + 4 + Octal integer + Octal integer <code>0_123</code> #loc + + \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/numeric/OctalLiteralFixesTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/numeric/OctalLiteralFixesTest.java new file mode 100644 index 000000000000..4c4c5ae72af8 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/numeric/OctalLiteralFixesTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.numeric; + +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.fixes.bugs.IGQuickFixesTestCase; + +public class OctalLiteralFixesTest extends IGQuickFixesTestCase { + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(new OctalLiteralInspection()); + } + + public void testConvertOctalToDecimal1() { + doTest("ConvertToDecimal1", InspectionGadgetsBundle.message("convert.octal.literal.to.decimal.literal.quickfix")); + } + + public void testConvertOctalToDecimal2() { + doTest("ConvertToDecimal2", InspectionGadgetsBundle.message("convert.octal.literal.to.decimal.literal.quickfix")); + } + + public void testRemoveLeadingZero() { + doTest("RemoveLeadingZero", InspectionGadgetsBundle.message("remove.leading.zero.to.make.decimal.quickfix")); + } + + @Override + protected String getRelativePath() { + return "numeric/octal"; + } +} diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/numeric/OctalLiteralInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/numeric/OctalLiteralInspectionTest.java new file mode 100644 index 000000000000..d7b7fca9b4fa --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/numeric/OctalLiteralInspectionTest.java @@ -0,0 +1,25 @@ +/* + * Copyright 2000-2011 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.numeric; + +import com.IGInspectionTestCase; + +public class OctalLiteralInspectionTest extends IGInspectionTestCase { + public void test() throws Exception { + doTest("com/siyeh/igtest/numeric/octal_inspection", + new OctalLiteralInspection()); + } +} \ No newline at end of file