Fix qualified subroutine name resolution when same-named sub exists in current package #98
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixes #93
Problem
When a subroutine like
sub Encodeexists in the current package, qualified calls likeEncode::is_utf8()were incorrectly being resolved to the local subroutine instead of the external package.This caused ExifTool to fail with:
Root Cause
The parser was checking for lexical subs and package sub overrides before checking if
::follows the identifier. So when parsingEncode::is_utf8, it would see thatXYZ::Encodeexists and treatEncodeas a subroutine call.Fixes
1. ParsePrimary.java
Don't treat an identifier as a lexical sub call if
::follows.Encode::is_utf8is a qualified name to the Encode package, not a call to localsub Encode.2. OperatorParser.java
Parse bareword module names in
requiredirectly usingparseSubroutineIdentifier()instead of going through the expression parser. This preventsrequire Encodefrom treatingEncodeas a subroutine call when a sub with the same name exists in the current package.Test Case
This now works correctly.