Conversation
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix the lexer and parser(grammar) - Add `PropertyHookDeclaration` as an `ASTNode` - Fix `PHP5ErrorHandlerImpl` (handle missing tokens) - Fix/Add unit tests for the lexer and parser - Remove `ArrayDimensionSyntaxSuggestionHint` because this no longer works. Example: ```php class PropertyHooksClass { public int $backed = 100 { get { return $this->backed; } set { $this->backed = $value; } } public $doubleArrow { // virtual get => $this->test(); set => $this->test() . $value; } public $attributes { #[Attr1] get {} #[Attr2] set ($value) { $this->attributes = $value; } } public $reference { &get => $this->reference; } public $final { final get => $this->final; } // constructor property promotion public function __construct( public $prop { get { return $this->prop; } set { $this->prop = $value; } } ) {} } class Child extends PropertyHooksClass { public $prop { get => parent::$prop::get(); set { parent::$prop::set($value); } } } interface PropertyHooksInterface { public string $prop1 { get; } final public int $prop2 { set; } public $prop3 { get; set; } public $ref { &get; } } ``` Note: Curly braces array access (`{}` e.g. `$array{1}`, `$array{'key'}`) can use no longer. Because a conflict occurs in the following case: ```php "string"{1}; public string $prop = "string" { get => $this->prop; set {} } ```
php/php.editor/src/org/netbeans/modules/php/editor/model/impl/ClassScopeImpl.java
Show resolved
Hide resolved
...tor/src/org/netbeans/modules/php/editor/verification/ArrayDimensionSyntaxSuggestionHint.java
Show resolved
Hide resolved
|
@tmysik This is not done yet. I'm slowly going to add more commits to this PR. Could you please have a look at each commit when you have time? |
php/php.editor/src/org/netbeans/modules/php/editor/csl/NavigatorScanner.java
Show resolved
Hide resolved
|
Time out occurs in Windows tests. I'll try adding commits one by one.
|
e1d3267 to
5e2fad5
Compare
|
@tmysik Please ignore this. I'll try to investigate this later... |
3bf0406 to
33472a7
Compare
php/php.editor/src/org/netbeans/modules/php/editor/model/impl/PropertyHookSignatureItem.java
Show resolved
Hide resolved
|
@tmysik It should be OK now. Probably, the cause is "Jackson". Instead, I used "JSON simple". |
php/php.editor/src/org/netbeans/modules/php/editor/api/elements/FieldElement.java
Outdated
Show resolved
Hide resolved
| * @return property hook elements | ||
| */ | ||
| public static List<PropertyHookElement> fromSignatureItems(final List<PropertyHookSignatureItem> signatureItems, final String field, final String filenameUrl, final ElementQuery elementQuery) { | ||
| List<PropertyHookElement> elements = new ArrayList<>(); |
There was a problem hiding this comment.
Nitpick:
| List<PropertyHookElement> elements = new ArrayList<>(); | |
| List<PropertyHookElement> elements = new ArrayList<>(signatureItems.size()); |
There was a problem hiding this comment.
|
I did a very quick review, and it looks good to me. Thanks for changing the code to the modern one, e.g. the switches :) |
33472a7 to
b7eb3b4
Compare
|
Fix folding feature: 8cff930 |
3b51984 to
8cff930
Compare
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix the indexer and the model - Use JSON format as a signature for property hooks - Current format is semicolon separated but it's hard to add hooks to a field signature without JSON format - Use the "JSON simple". If we use "Jackson", problems(timeout, java.lang.NoClassDefFoundError) occurs in CI for Windows ```json [ { "name":"set", "start":3651, "end":3690, "mod":1, "isRef":false, "isAttr":false, "hasBody":true, "paramSig":"$value::0::1:1:0:0:0:0::" } ] ``` - Add interface methods - `FieldElemnt.isHooked()` - `FieldElement.HookedFieldElemnt.isHooked()` - `FieldElement.HookedFieldElemnt.getPropertyHooks()` - `IndexScope.PHP84IndexScope.findFields()` - `TypeScope.FieldDeclarable.getDeclaredFields()` - `TypeScope.FieldDeclarable.getInheritedFields()` - `PropertyHookScope.isReference()` - `PropertyHookScope.hasBody()` - `PropertyHookScope.isAttributed()` - `PropertyHookScope.getParameterNames()` - `PropertyHookScope.getParameters()` - `PropertyHookScope.getOffsetRange()` - `PropertyHookElement.isReference()` - `PropertyHookElement.hasBody()` - `PropertyHookElement.isAttributed()` - `PropertyHookElement.getParameters()` - `PropertyHookElement.getOffsetRange()` - Add/Fix unit tests for the index and the model Log: ``` FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: getSignatureFromScopes() took: 0 ms INFO [org.netbeans.ui.indexing]: Indexing finished, indexing took 14 ms. FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 1 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms FINE [org.netbeans.modules.php.editor.model.impl.PropertyHookSignatureItem]: fromSignature() took: 0 ms ```
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix the navigator - Fix/Add unit tests - Add SVG icons for a property hook, a trait, and an enum case
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix the folding feature - Add unit tests
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix the formatter and `PhpTypedBreakInterceptor` - New Formatting Options - Braces - Field Declaration (Same Line by default) - Property Hook (Same Line by default) - Blank Lines - Between Property Hooks (0 by default) - Empty Property Hook Body (Unchecked by default) - Spaces - Before Left Braces - Field Declaration (Checked by default) - Property Hook Declaration (Checked by default) - Add unit tests
8cff930 to
5348d53
Compare
| for (int mode : bitmask) { | ||
| this.mod |= mode; | ||
| } | ||
| if (!Modifier.isPrivate(mod) && !Modifier.isProtected(mod) && !Modifier.isImplicitPublic(mod)) { | ||
| mod |= Modifier.PUBLIC; | ||
| if (!Modifier.isPrivate(mod) && !Modifier.isProtected(mod) && !Modifier.isPublic(mod)) { | ||
| mod |= Modifier.IMPLICIT_PUBLIC; | ||
| } |
There was a problem hiding this comment.
IMPLICIT_PUBLIC is better if mod is 0 because the public modifier doesn't exist.
| } | ||
| sb.append(IndentUtils.createIndentString(doc, indent)); | ||
| } else { | ||
| LexUtilities.findPreviousToken(ts, Arrays.asList(PHPTokenId.PHP_CURLY_OPEN)); |
There was a problem hiding this comment.
There is a bug here:
e.g.
class C { // expected curly brace
public function test() { // but found this brace
}
^} // caret positionInstead, find a correct brace via the new method (findCurlyOpenOffset()).
| final get | ||
| { | ||
| return 100; | ||
| } |
There was a problem hiding this comment.
This is an existing bug. I didn't fix it (maybe, the priority is very low) because I don't think the New Line Indented option is important.
We can also reproduce this using a method.
class C {
public function example() { return 100;}
}|
@junichi11, please, let me know once this PR is ready for the review (no rush!). Thank you. |
|
@tmysik OK. I'll do that after I fix the other features(Hints, CC, Go to Declaration, etc.) :) |
|
@junichi11, as I wrote, take your time, it is a very complex feature. Thank you |
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix the indentation that is inserted when a new line is added - Fix an existing bug for a lambda function - Add unit tests Existing bug: ```php // example test( function(): void {^ ); ``` ```php // before test( function(): void { ^ } ); // after test( function(): void { ^ } ); ```
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix `ModifiersCheckHintError` - Add unit tests Example: ```php class PropertyHooksClass { private $invalidPrivateFinal { final get{} // cannot use final } private $invalidPublic01 { public get; // cannot use public } public $invalidStatic01 { static get {} // cannot use static } public static $invalidStatic02 { // cannot use static get{} set{} } public $invalidNonAbstract { get; // need a body set; // need a body } public readonly int $invalidReadonly { get{} set{} } // cannot use readonly } interface PropertyHookInterface { abstract public $invalid01 { get; set; } // cannot use abstract protected $invalid02 {get; set;} // cannot use protected private $invalid03 { // cannot use private get; set; } public $invalid04 { final get; // cannot use final } final public $invalid05 { // cannot use final get; set; } public $invalid06 { get {} // cannot has a body } public private(set) int $invalid07 { // cannot use private(set) set; } final public int $invalid08 { // cannot use final set; } public readonly int $invalid09 { // cannot use readonly get; } } ``` - Fix a formatting issue Example: ``` interface TestInterface { public int $prop1 {get; set;} public int $prop2 {} ^^^^^^^ selected here } // before interface TestInterface { public int $prop1 {get; set;} public int $prop2 {} } // after interface TestInterface { public int $prop1 {get; set;} public int $prop2 {} } ```
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix `WrongOrderOfArgsHint` - Add/Fix unit tests Example: ```php public function __construct( private ?int $optional = 1 { get { return $this->optional; } set { $this->optional = $value; } }, $mandatory, ) {} // apply fix public function __construct( $mandatory, private ?int $optional = 1 { get { return $this->optional; } set { $this->optional = $value; } }, ) {} ```
- apache#8035 - https://wiki.php.net/rfc#php_84 - https://wiki.php.net/rfc/property-hooks - Fix `ImmutableVariablesHint` - Add unit tests Example: ```php class PropertyHooksClass { public int $backed = 100 { set(int $value) { $this->backed = $value; } } public $attributes { #[Attr2] set ($value) { $this->attributes = $value; } } } // before: class PropertyHooksClass { public int $backed = 100 { set(int $value) { // a hint is shown $this->backed = $value; } } public $attributes { #[Attr2] set ($value) { // a hint is shown $this->attributes = $value; } } } // after: no hint ```
|
I'll change the milestone to |
|
Removing the milestone as this doesn't look likely to merge in the next few days? Please retarget when ready. |
|
to breathe some new life into things… @junichi11 seems to be missing quite a while now (last action om June 2025), which is really bad, as he did great things for this project. I am very, very grateful and I hope he's doing well and that he's back here soon. 🙏 Anyway, this PR sits around here over a year now property hooks are badly missing, as it is a large part of PHP 8.4, which was released 21 Nov 2024. There's PHP 8.5 already for awhile and still 8.4 isn't fully usable. I don't know what the custom is, but is it possible for someone else to take over this PR? @tmysik? @haidubogdan comes to mind… You seem to have the necessary skills and did a great job with the pipe operator PR. I really hope you're up for it and also have the time to do it. (Too bad, NetBeans isn’t written in PHP, then I would be onboard 😉) One can live with missing comfort or extras and work around one or the other little bug or problem. But when support for recent PHP features is missing then I don't see a bright future for NetBeans PHP editor, that I really like 😥 |
|
@rarila I think I can do a fork of the evolution and try to continue this PR. |
|
@haidubogdan Awesome, I can't await it! 🚀 |
|
Sorry for the delay... I’m planning to get back to this next month or later, though I can’t promise a specific timeline yet. |
|
@junichi11, no need to apologize, we all do it in our leisure time. I hope all is OK on your side 🤞 |
… took only three days … next thing I gonna wish is world peace! 😏 @junichi11 great to see you’re still (again) around! 😌 |
|
I'll do this myself. Even if something appears to be abandoned, it's best to avoid creating a PR that uses it as your own commit without the original author's permission. |
PHP 8.4 Support: Property hooks (Part 1)
PropertyHookDeclarationas anASTNodePHP5ErrorHandlerImpl(handle missing tokens)ArrayDimensionSyntaxSuggestionHintbecause this no longer works.Example:
Note: Curly braces array access (
{}e.g.$array{1},$array{'key'}) can use no longer.Because a conflict occurs in the following case:
PHP 8.4
PHP 8.3
PHP 8.4 Support: Property hooks (Part 2)
[ { "name":"set", "start":3651, "end":3690, "mod":1, "isRef":false, "isAttr":false, "hasBody":true, "paramSig":"$value::0::1:1:0:0:0:0::" } ]Add interface methods
FieldElemnt.isHooked()FieldElement.HookedFieldElemnt.isHooked()FieldElement.HookedFieldElemnt.getPropertyHooks()IndexScope.PHP84IndexScope.findFields()TypeScope.FieldDeclarable.getDeclaredFields()TypeScope.FieldDeclarable.getInheritedFields()PropertyHookScope.isReference()PropertyHookScope.hasBody()PropertyHookScope.isAttributed()PropertyHookScope.getParameterNames()PropertyHookScope.getParameters()PropertyHookScope.getOffsetRange()PropertyHookElement.isReference()PropertyHookElement.hasBody()PropertyHookElement.isAttributed()PropertyHookElement.getParameters()PropertyHookElement.getOffsetRange()Add/Fix unit tests for the index and the model
PHP 8.4 Support: Property hooks (Part 3)
PHP 8.4 Support: Property hooks (Part 4)
Expanded:
Collapsed:
PHP 8.4 Support: Property hooks (Part 5)
PhpTypedBreakInterceptorExample:
Formatted: