Skip to content

Commit 3abcc5e

Browse files
committed
PHP 8.4 Support: Property hooks (Part 5)
- 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
1 parent 5348d53 commit 3abcc5e

File tree

47 files changed

+11018
-270
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+11018
-270
lines changed

php/php.editor/src/org/netbeans/modules/php/editor/indent/CodeStyle.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,16 @@ public BracePlacement getMethodDeclBracePlacement() {
109109
return BracePlacement.valueOf(placement);
110110
}
111111

112+
public BracePlacement getFieldDeclBracePlacement() {
113+
String placement = preferences.get(FIELD_DECL_BRACE_PLACEMENT, getDefaultAsString(FIELD_DECL_BRACE_PLACEMENT));
114+
return BracePlacement.valueOf(placement);
115+
}
116+
117+
public BracePlacement getPropertyHookDeclBracePlacement() {
118+
String placement = preferences.get(PROPERTY_HOOK_DECL_BRACE_PLACEMENT, getDefaultAsString(PROPERTY_HOOK_DECL_BRACE_PLACEMENT));
119+
return BracePlacement.valueOf(placement);
120+
}
121+
112122
public BracePlacement getIfBracePlacement() {
113123
String placement = preferences.get(IF_BRACE_PLACEMENT, getDefaultAsString(IF_BRACE_PLACEMENT));
114124
return BracePlacement.valueOf(placement);
@@ -208,6 +218,14 @@ public int getBlankLinesBetweenFields() {
208218
return preferences.getInt(BLANK_LINES_BETWEEN_FIELDS, getDefaultAsInt(BLANK_LINES_BETWEEN_FIELDS));
209219
}
210220

221+
public int getBlankLinesBeforePropertyHooks() {
222+
return preferences.getInt(BLANK_LINES_BEFORE_PROPERTY_HOOKS, getDefaultAsInt(BLANK_LINES_BEFORE_PROPERTY_HOOKS));
223+
}
224+
225+
public int getBlankLinesBetweenPropertyHooks() {
226+
return preferences.getInt(BLANK_LINES_BETWEEN_PROPERTY_HOOKS, getDefaultAsInt(BLANK_LINES_BETWEEN_PROPERTY_HOOKS));
227+
}
228+
211229
public int getBlankLinesAfterFields() {
212230
return preferences.getInt(BLANK_LINES_AFTER_FIELDS, getDefaultAsInt(BLANK_LINES_AFTER_FIELDS));
213231
}
@@ -220,6 +238,10 @@ public boolean getBlankLinesEmptyFunctionBody() {
220238
return preferences.getBoolean(BLANK_LINES_EMPTY_FUNCTION_BODY, getDefaultAsBoolean(BLANK_LINES_EMPTY_FUNCTION_BODY));
221239
}
222240

241+
public boolean getBlankLinesEmptyPropertyHookBody() {
242+
return preferences.getBoolean(BLANK_LINES_EMPTY_PROPERTY_HOOK_BODY, getDefaultAsBoolean(BLANK_LINES_EMPTY_PROPERTY_HOOK_BODY));
243+
}
244+
223245
/**
224246
*
225247
* @return true it the fields will be group without php doc together (no empty line between them)
@@ -386,6 +408,14 @@ public boolean spaceBeforeMethodDeclLeftBrace() {
386408
return preferences.getBoolean(SPACE_BEFORE_METHOD_DECL_LEFT_BRACE, getDefaultAsBoolean(SPACE_BEFORE_METHOD_DECL_LEFT_BRACE));
387409
}
388410

411+
public boolean spaceBeforeFieldDeclLeftBrace() {
412+
return preferences.getBoolean(SPACE_BEFORE_FIELD_DECL_LEFT_BRACE, getDefaultAsBoolean(SPACE_BEFORE_FIELD_DECL_LEFT_BRACE));
413+
}
414+
415+
public boolean spaceBeforePropertyHookDeclLeftBrace() {
416+
return preferences.getBoolean(SPACE_BEFORE_PROPERTY_HOOK_DECL_LEFT_BRACE, getDefaultAsBoolean(SPACE_BEFORE_PROPERTY_HOOK_DECL_LEFT_BRACE));
417+
}
418+
389419
public boolean spaceBeforeIfLeftBrace() {
390420
return preferences.getBoolean(SPACE_BEFORE_IF_LEFT_BRACE, getDefaultAsBoolean(SPACE_BEFORE_IF_LEFT_BRACE));
391421
}

php/php.editor/src/org/netbeans/modules/php/editor/indent/FmtOptions.java

Lines changed: 49 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public final class FmtOptions {
8181
public static final String CLASS_DECL_BRACE_PLACEMENT = "classDeclBracePlacement"; //NOI18N
8282
public static final String ANONYMOUS_CLASS_BRACE_PLACEMENT = "anonymousClassBracePlacement"; //NOI18N
8383
public static final String METHOD_DECL_BRACE_PLACEMENT = "methodDeclBracePlacement"; //NOI18N
84+
public static final String FIELD_DECL_BRACE_PLACEMENT = "fieldDeclBracePlacement"; //NOI18N
85+
public static final String PROPERTY_HOOK_DECL_BRACE_PLACEMENT = "propertyHookDeclBracePlacement"; //NOI18N
8486
public static final String IF_BRACE_PLACEMENT = "ifBracePlacement"; //NOI18N
8587
public static final String FOR_BRACE_PLACEMENT = "forBracePlacement"; //NOI18N
8688
public static final String WHILE_BRACE_PLACEMENT = "whileBracePlacement"; //NOI18N
@@ -104,7 +106,10 @@ public final class FmtOptions {
104106
public static final String BLANK_LINES_BEFORE_FIELDS = "blankLinesBeforeField"; //NOI18N
105107
public static final String BLANK_LINES_BETWEEN_FIELDS = "blankLinesBetweenField"; //NOI18N
106108
public static final String BLANK_LINES_AFTER_FIELDS = "blankLinesAfterField"; //NOI18N
109+
public static final String BLANK_LINES_BEFORE_PROPERTY_HOOKS = "blankLinesBeforePropertyHooks"; //NOI18N
110+
public static final String BLANK_LINES_BETWEEN_PROPERTY_HOOKS = "blankLinesBetweenPropertyHooks"; //NOI18N
107111
public static final String BLANK_LINES_EMPTY_FUNCTION_BODY = "blankLinesEmptyFunctionBody"; //NOI18N
112+
public static final String BLANK_LINES_EMPTY_PROPERTY_HOOK_BODY = "blankLinesEmptyPropertyHookBody"; //NOI18N
108113
public static final String BLANK_LINES_EOF = "blankLinesEndOfFile"; //NOI18N
109114
public static final String BLANK_LINES_GROUP_FIELDS_WITHOUT_DOC_AND_ATTRIBUTES = "blankLinesGroupFieldsWithoutDocAndAttributes"; //NOI18N
110115
public static final String BLANK_LINES_BEFORE_FUNCTION = "blankLinesBeforeFunction"; //NOI18N
@@ -146,6 +151,8 @@ public final class FmtOptions {
146151
public static final String SPACE_BEFORE_CLASS_DECL_LEFT_BRACE = "spaceBeforeClassDeclLeftBrace"; //NOI18N
147152
public static final String SPACE_BEFORE_ANONYMOUS_CLASS_LEFT_BRACE = "spaceBeforeAnonymousClassLeftBrace"; //NOI18N
148153
public static final String SPACE_BEFORE_METHOD_DECL_LEFT_BRACE = "spaceBeforeMethodDeclLeftBrace"; //NOI18N
154+
public static final String SPACE_BEFORE_FIELD_DECL_LEFT_BRACE = "spaceBeforeFieldDeclLeftBrace"; //NOI18N
155+
public static final String SPACE_BEFORE_PROPERTY_HOOK_DECL_LEFT_BRACE = "spaceBeforePropertyHookDeclLeftBrace"; //NOI18N
149156
public static final String SPACE_BEFORE_IF_LEFT_BRACE = "spaceBeforeIfLeftBrace"; //NOI18N
150157
public static final String SPACE_BEFORE_ELSE_LEFT_BRACE = "spaceBeforeElseLeftBrace"; //NOI18N
151158
public static final String SPACE_BEFORE_WHILE_LEFT_BRACE = "spaceBeforeWhileLeftBrace"; //NOI18N
@@ -239,15 +246,15 @@ private FmtOptions() {
239246
}
240247

241248
public static int getDefaultAsInt(String key) {
242-
return Integer.parseInt(defaults.get(key));
249+
return Integer.parseInt(DEFAULTS.get(key));
243250
}
244251

245252
public static boolean getDefaultAsBoolean(String key) {
246-
return Boolean.parseBoolean(defaults.get(key));
253+
return Boolean.parseBoolean(DEFAULTS.get(key));
247254
}
248255

249256
public static String getDefaultAsString(String key) {
250-
return defaults.get(key);
257+
return DEFAULTS.get(key);
251258
}
252259
// Private section ---------------------------------------------------------
253260
private static final String TRUE = "true"; // NOI18N
@@ -260,13 +267,9 @@ public static String getDefaultAsString(String key) {
260267
public static final String WRAP_ALWAYS = CodeStyle.WrapStyle.WRAP_ALWAYS.name();
261268
public static final String WRAP_IF_LONG = CodeStyle.WrapStyle.WRAP_IF_LONG.name();
262269
public static final String WRAP_NEVER = CodeStyle.WrapStyle.WRAP_NEVER.name();
263-
private static Map<String, String> defaults;
270+
private static final Map<String, String> DEFAULTS = Map.copyOf(createDefaults());
264271

265-
static {
266-
createDefaults();
267-
}
268-
269-
private static void createDefaults() {
272+
private static Map<String, String> createDefaults() {
270273
String[][] defaultValues = {
271274
{EXPAND_TAB_TO_SPACES, TRUE}, //NOI18N
272275
{TAB_SIZE, "8"}, //NOI18N
@@ -281,6 +284,8 @@ private static void createDefaults() {
281284
{CLASS_DECL_BRACE_PLACEMENT, OBRACE_SAMELINE},
282285
{ANONYMOUS_CLASS_BRACE_PLACEMENT, OBRACE_SAMELINE},
283286
{METHOD_DECL_BRACE_PLACEMENT, OBRACE_SAMELINE},
287+
{FIELD_DECL_BRACE_PLACEMENT, OBRACE_SAMELINE},
288+
{PROPERTY_HOOK_DECL_BRACE_PLACEMENT, OBRACE_SAMELINE},
284289
{IF_BRACE_PLACEMENT, OBRACE_SAMELINE},
285290
{FOR_BRACE_PLACEMENT, OBRACE_SAMELINE},
286291
{WHILE_BRACE_PLACEMENT, OBRACE_SAMELINE},
@@ -303,10 +308,13 @@ private static void createDefaults() {
303308
{BLANK_LINES_BEFORE_CLASS_END, "0"}, //NOI18N
304309
{BLANK_LINES_BEFORE_FIELDS, "1"}, //NOI18N
305310
{BLANK_LINES_EMPTY_FUNCTION_BODY, TRUE},
311+
{BLANK_LINES_BEFORE_PROPERTY_HOOKS, "0"}, //NOI18N
312+
{BLANK_LINES_EMPTY_PROPERTY_HOOK_BODY, FALSE},
306313
{BLANK_LINES_EOF, FALSE},
307314
{BLANK_LINES_GROUP_FIELDS_WITHOUT_DOC_AND_ATTRIBUTES, TRUE},
308315
{BLANK_LINES_BETWEEN_FIELDS, "1"}, //NOI18N
309316
{BLANK_LINES_AFTER_FIELDS, "1"}, //NOI18N
317+
{BLANK_LINES_BETWEEN_PROPERTY_HOOKS, "0"}, //NOI18N
310318
{BLANK_LINES_BEFORE_FUNCTION, "1"}, //NOI18N
311319
{BLANK_LINES_AFTER_FUNCTION, "1"}, //NOI18N
312320
{BLANK_LINES_BEFORE_FUNCTION_END, "0"}, //NOI18N
@@ -346,6 +354,8 @@ private static void createDefaults() {
346354
{SPACE_AROUND_INTERSECTION_TYPE_SEPARATOR, FALSE},
347355
{SPACE_BEFORE_CLASS_DECL_LEFT_BRACE, TRUE},
348356
{SPACE_BEFORE_METHOD_DECL_LEFT_BRACE, TRUE},
357+
{SPACE_BEFORE_FIELD_DECL_LEFT_BRACE, TRUE},
358+
{SPACE_BEFORE_PROPERTY_HOOK_DECL_LEFT_BRACE, TRUE},
349359
{SPACE_BEFORE_IF_LEFT_BRACE, TRUE},
350360
{SPACE_BEFORE_ELSE_LEFT_BRACE, TRUE},
351361
{SPACE_BEFORE_WHILE_LEFT_BRACE, TRUE},
@@ -436,16 +446,15 @@ private static void createDefaults() {
436446
{USES_KEEP_EXISTING_TYPE_ORDER, TRUE},
437447
};
438448

439-
defaults = new HashMap<>();
440-
449+
Map<String, String> defaults = new HashMap<>();
441450
for (java.lang.String[] strings : defaultValues) {
442451
defaults.put(strings[0], strings[1]);
443452
}
444-
453+
return defaults;
445454
}
446455

447456
public static Map<String, String> getDefaults() {
448-
return defaults;
457+
return DEFAULTS;
449458
}
450459

451460
// Support section ---------------------------------------------------------
@@ -569,19 +578,15 @@ public void refreshPreview() {
569578
pane.setIgnoreRepaint(true);
570579

571580
final Document doc = pane.getDocument();
572-
if (doc instanceof BaseDocument) {
581+
if (doc instanceof BaseDocument baseDocument) {
573582
final Reformat reformat = Reformat.get(doc);
574583
reformat.lock();
575584
try {
576-
((BaseDocument) doc).runAtomic(new Runnable() {
577-
@Override
578-
public void run() {
579-
580-
try {
581-
reformat.reformat(0, doc.getLength());
582-
} catch (BadLocationException ble) {
583-
LOGGER.log(Level.WARNING, null, ble);
584-
}
585+
baseDocument.runAtomic(() -> {
586+
try {
587+
reformat.reformat(0, doc.getLength());
588+
} catch (BadLocationException ble) {
589+
LOGGER.log(Level.WARNING, null, ble);
585590
}
586591
});
587592
} finally {
@@ -650,27 +655,22 @@ public PreferencesCustomizer create(Preferences preferences) {
650655
// Private methods -----------------------------------------------------
651656
private void performOperation(Operation operation, JComponent jc, String optionID, Preferences p) {
652657
switch (operation) {
653-
case LOAD:
654-
loadData(jc, optionID, p);
655-
break;
656-
case STORE:
657-
storeData(jc, optionID, p);
658-
break;
659-
case ADD_LISTENERS:
660-
addListener(jc);
661-
break;
662-
default:
658+
case LOAD -> loadData(jc, optionID, p);
659+
case STORE -> storeData(jc, optionID, p);
660+
case ADD_LISTENERS -> addListener(jc);
661+
default -> {
663662
assert false : operation;
663+
}
664664
}
665665
}
666666

667667
private void scan(Operation what, Preferences p) {
668668
for (JComponent jc : components) {
669669
Object o = jc.getClientProperty(OPTION_ID);
670-
if (o instanceof String) {
671-
performOperation(what, jc, (String) o, p);
672-
} else if (o instanceof String[]) {
673-
for (String oid : (String[]) o) {
670+
if (o instanceof String string) {
671+
performOperation(what, jc, string, p);
672+
} else if (o instanceof String[] strings) {
673+
for (String oid : strings) {
674674
performOperation(what, jc, oid, p);
675675
}
676676
}
@@ -679,8 +679,7 @@ private void scan(Operation what, Preferences p) {
679679

680680
private void scan(Container container, List<JComponent> components) {
681681
for (Component c : container.getComponents()) {
682-
if (c instanceof JComponent) {
683-
JComponent jc = (JComponent) c;
682+
if (c instanceof JComponent jc) {
684683
Object o = jc.getClientProperty(OPTION_ID);
685684
if (o instanceof String || o instanceof String[]) {
686685
components.add(jc);
@@ -698,22 +697,18 @@ private void scan(Container container, List<JComponent> components) {
698697
*/
699698
private void loadData(JComponent jc, String optionID, Preferences node) {
700699

701-
if (jc instanceof JTextField) {
702-
JTextField field = (JTextField) jc;
700+
if (jc instanceof JTextField field) {
703701
field.setText(node.get(optionID, getDefaultAsString(optionID)));
704-
} else if (jc instanceof JCheckBox) {
705-
JCheckBox checkBox = (JCheckBox) jc;
702+
} else if (jc instanceof JCheckBox checkBox) {
706703
boolean df = getDefaultAsBoolean(optionID);
707704
checkBox.setSelected(node.getBoolean(optionID, df));
708-
} else if (jc instanceof JComboBox) {
709-
JComboBox cb = (JComboBox) jc;
705+
} else if (jc instanceof JComboBox comboBox) {
710706
String value = node.get(optionID, getDefaultAsString(optionID));
711707
ComboBoxModel model = createModel(value);
712-
cb.setModel(model);
708+
comboBox.setModel(model);
713709
ComboItem item = whichItem(value, model);
714-
cb.setSelectedItem(item);
715-
} else if (jc instanceof JRadioButton) {
716-
JRadioButton radioButton = (JRadioButton) jc;
710+
comboBox.setSelectedItem(item);
711+
} else if (jc instanceof JRadioButton radioButton) {
717712
boolean df = getDefaultAsBoolean(optionID);
718713
radioButton.setSelected(node.getBoolean(optionID, df));
719714
}
@@ -769,16 +764,13 @@ && getDefaultAsString(optionID).equals(text)) {
769764
}
770765

771766
private void addListener(JComponent jc) {
772-
if (jc instanceof JTextField) {
773-
JTextField field = (JTextField) jc;
767+
if (jc instanceof JTextField field) {
774768
field.addActionListener(this);
775769
field.getDocument().addDocumentListener(this);
776-
} else if (jc instanceof JCheckBox) {
777-
JCheckBox checkBox = (JCheckBox) jc;
770+
} else if (jc instanceof JCheckBox checkBox) {
778771
checkBox.addActionListener(this);
779-
} else if (jc instanceof JComboBox) {
780-
JComboBox cb = (JComboBox) jc;
781-
cb.addActionListener(this);
772+
} else if (jc instanceof JComboBox comboBox) {
773+
comboBox.addActionListener(this);
782774
}
783775
}
784776

@@ -956,7 +948,7 @@ public interface CodeStyleProducer {
956948
}
957949

958950
public static boolean isInteger(String optionID) {
959-
String value = defaults.get(optionID);
951+
String value = DEFAULTS.get(optionID);
960952

961953
try {
962954
Integer.parseInt(value);

php/php.editor/src/org/netbeans/modules/php/editor/indent/FormatToken.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ public enum Kind {
7979
WHITESPACE_AFTER_CLASS_LEFT_BRACE,
8080
WHITESPACE_AFTER_ANONYMOUS_CLASS_LEFT_BRACE,
8181
WHITESPACE_AFTER_KEYWORD,
82+
WHITESPACE_AFTER_FIELD_LEFT_BRACE,
83+
WHITESPACE_BEFORE_FIELD_LEFT_BRACE,
84+
WHITESPACE_BEFORE_PROPERTY_HOOK_LEFT_BRACE,
8285
WHITESPACE_BEFORE_FUNCTION_LEFT_BRACE,
8386
WHITESPACE_BEFORE_IF_LEFT_BRACE,
8487
WHITESPACE_BEFORE_ELSE_LEFT_BRACE,
@@ -94,6 +97,8 @@ public enum Kind {
9497
WHITESPACE_AFTER_OTHER_LEFT_BRACE,
9598
WHITESPACE_BEFORE_CLASS_RIGHT_BRACE,
9699
WHITESPACE_BEFORE_ANONYMOUS_CLASS_RIGHT_BRACE,
100+
WHITESPACE_BEFORE_FIELD_RIGHT_BRACE,
101+
WHITESPACE_BEFORE_PROPERTY_HOOK_RIGHT_BRACE,
97102
WHITESPACE_BEFORE_FUNCTION_RIGHT_BRACE,
98103
WHITESPACE_BEFORE_IF_RIGHT_BRACE,
99104
WHITESPACE_BEFORE_FOR_RIGHT_BRACE,
@@ -142,9 +147,13 @@ public enum Kind {
142147
WHITESPACE_BEFORE_FIELDS,
143148
WHITESPACE_BETWEEN_FIELDS,
144149
WHITESPACE_AFTER_FIELDS,
150+
WHITESPACE_BEFORE_PROPERTY_HOOKS,
151+
WHITESPACE_BETWEEN_PROPERTY_HOOKS,
152+
WHITESPACE_AFTER_PROPERTY_HOOKS,
145153
WHITESPACE_BETWEEN_LINE_COMMENTS,
146154
WHITESPACE_BETWEEN_OPEN_CLOSE_BRACES,
147155
WHITESPACE_BETWEEN_FUNCTION_OPEN_CLOSE_BRACES,
156+
WHITESPACE_BETWEEN_PROPERTY_HOOK_OPEN_CLOSE_BRACES,
148157
WHITESPACE_IN_ARGUMENT_LIST,
149158
WHITESPACE_IN_ARRAY_ELEMENT_LIST,
150159
WHITESPACE_IN_INTERFACE_LIST,
@@ -251,8 +260,8 @@ private boolean isWhitespace(Kind kind) {
251260
public String toString() {
252261
StringBuilder sb = new StringBuilder();
253262
sb.append(id.name());
254-
if (this instanceof IndentToken) {
255-
sb.append("(").append(((IndentToken) this).getDelta()).append(")"); // NOI18N
263+
if (this instanceof IndentToken indentToken) {
264+
sb.append("(").append(indentToken.getDelta()).append(")"); // NOI18N
256265
}
257266
sb.append(" offset: ").append(offset); // NOI18N
258267
if (oldText != null) {

0 commit comments

Comments
 (0)