diff --git a/analysis/pokemon.d b/analysis/pokemon.d index 640f0cb..3868c28 100644 --- a/analysis/pokemon.d +++ b/analysis/pokemon.d @@ -40,17 +40,35 @@ class PokemonExceptionCheck : BaseAnalyzer lc.accept(this); } + bool ignoreType = true; + override void visit(const Catch c) { - if (c.type.type2.symbol.identifierOrTemplateChain.identifiersOrTemplateInstances.length != 1) + ignoreType = false; + c.type.accept(this); + ignoreType = true; + + c.accept(this); + } + + + override void visit(const Type2 type2) + { + if (ignoreType) return; + + if (type2.type !is null) { - c.accept(this); + type2.type.accept(this); return; } - auto identOrTemplate = c.type.type2.symbol.identifierOrTemplateChain.identifiersOrTemplateInstances[0]; + + if (type2.symbol.identifierOrTemplateChain.identifiersOrTemplateInstances.length != 1) + { + return; + } + auto identOrTemplate = type2.symbol.identifierOrTemplateChain.identifiersOrTemplateInstances[0]; if (identOrTemplate.templateInstance !is null) { - c.accept(this); return; } if (identOrTemplate.identifier.text == "Throwable" @@ -60,7 +78,6 @@ class PokemonExceptionCheck : BaseAnalyzer immutable line = identOrTemplate.identifier.line; addErrorMessage(line, column, message); } - c.accept(this); } } @@ -83,6 +100,10 @@ unittest catch (Exception err) // ok { + } + catch (shared(Exception) err) // ok + { + } catch (Error err) // [warn]: Catching Error or Throwable is almost always a bad idea. { @@ -91,9 +112,14 @@ unittest catch (Throwable err) // [warn]: Catching Error or Throwable is almost always a bad idea. { + } + catch (shared(Error) err) // [warn]: Catching Error or Throwable is almost always a bad idea. + { + } catch // [warn]: Catching Error or Throwable is almost always a bad idea. { + } } }c, sac); diff --git a/analysis/range.d b/analysis/range.d index 3f37fae..0722329 100644 --- a/analysis/range.d +++ b/analysis/range.d @@ -74,18 +74,23 @@ class BackwardsRangeCheck : BaseAnalyzer override void visit(const PrimaryExpression primary) { + import std.conv; + if (state == State.ignore || !isNumberLiteral(primary.primary.type)) return; if (state == State.left) { line = primary.primary.line; this.column = primary.primary.column; - left = parseNumber(primary.primary.text); + + try left = parseNumber(primary.primary.text); + catch (ConvException e) return; hasLeft = true; } else { - right = parseNumber(primary.primary.text); + try right = parseNumber(primary.primary.text); + catch (ConvException e) return; hasRight = true; } } diff --git a/dub.json b/dub.json index c67d6fb..ff26bbd 100644 --- a/dub.json +++ b/dub.json @@ -1,20 +1,10 @@ { - "name": "dscanner", - "description": "Swiss-army knife for D source code", - "copyright": "© Brian Schott", - "authors": ["Brian Schott"], - "importPaths": ["."], + "name": "dscanner", + "description": "Swiss-army knife for D source code", + "copyright": "© Brian Schott", + "authors": ["Brian Schott"], "license" : "Boost Software License - Version 1.0", - "configurations": [ - { - "name": "library", - "targetType": "library", - "sourcePaths": ["std"], - }, - { - "name": "dscanner", - "targetType": "executable", - "sourcePaths": ["."], - }, - ], + "targetType": "executable", + "sourcePaths": ["."], + "excludedSourceFiles": ["inifiled/inifiled.d", "inifiled/test.d"], }