Consider usecase (precondition):
- Class/Interface structure: Interface I -> AbstractClass A implements I -> ConcreteClass C extends A
- Interface defines method foo()
- Abstract class DOES NOT implements foo()
- ConcreteClass implements foo()
Consider that ALL stated Interface/Classes are within same namespace.
If matcher is execution(public *->foo()), abstract class gets weaved -> it is interpreted as if there is a method foo, but there is not.
Possible fix: check PHP Tokenizer and class metadata for better introspection of implemented methods.
Consider usecase (precondition):
Consider that ALL stated Interface/Classes are within same namespace.
If matcher is execution(public *->foo()), abstract class gets weaved -> it is interpreted as if there is a method foo, but there is not.
Possible fix: check PHP Tokenizer and class metadata for better introspection of implemented methods.