You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by lk...@apache.org on 2020/09/18 14:04:13 UTC
[netbeans] branch master updated: [NETBEANS-4745] Include immutable
objects for fxml editor identification
This is an automated email from the ASF dual-hosted git repository.
lkishalmi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 6a94745 [NETBEANS-4745] Include immutable objects for fxml editor identification
6a94745 is described below
commit 6a947454a8f2cf891e5f66ca4aad9943d3832b25
Author: Ernie Rael <er...@raelity.com>
AuthorDate: Thu Aug 27 22:07:17 2020 +0100
[NETBEANS-4745] Include immutable objects for fxml editor identification
---
.../editor/completion/beans/BeanModelBuilder.java | 75 ++++++++++++++++++++++
.../editor/completion/beans/FxDefinitionKind.java | 5 ++
2 files changed, 80 insertions(+)
diff --git a/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/BeanModelBuilder.java b/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/BeanModelBuilder.java
index 863490d..0ca3c7f 100644
--- a/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/BeanModelBuilder.java
+++ b/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/BeanModelBuilder.java
@@ -26,8 +26,11 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Set;
+
import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
@@ -46,6 +49,7 @@ import javax.lang.model.type.WildcardType;
import javax.lang.model.util.AbstractTypeVisitor7;
import javax.lang.model.util.ElementFilter;
import javax.lang.model.util.Types;
+
import org.netbeans.api.annotations.common.NullAllowed;
import org.netbeans.api.editor.mimelookup.MimeLookup;
import org.netbeans.api.java.source.CompilationInfo;
@@ -310,6 +314,77 @@ public final class BeanModelBuilder {
addMapProperty(m, n);
}
}
+ if (allProperties.isEmpty() && !resultInfo.isFxInstance()) {
+ processGettersCheckForImmutables();
+ }
+ }
+
+ private static final String NAMED_ARG = "javafx.beans.NamedArg";
+
+ /** Some javafx classes, such as Insets, are immutable and do not have
+ * no argument constructors or setters; so they are not found.
+ * Accept a property if there is a getter with a corresponding
+ * constructor param declared with NamedArg annotation; use constructor
+ * with the most NamedArg parameters.
+ * <p/>
+ * One alternate strategy would be to provide a document with lines like:
+ * "Insets: top bottom left right" and use this info.
+ */
+ private void processGettersCheckForImmutables() {
+ Set<String> propsConstructor = Collections.emptySet();
+ Set<String> props1 = new HashSet<>();
+ CHECK_CONSTR: for (ExecutableElement c : ElementFilter.constructorsIn(classElement.getEnclosedElements())) {
+ props1.clear();
+ CHECK_PARAMS: for (VariableElement p : c.getParameters()) {
+ for (AnnotationMirror am : p.getAnnotationMirrors()) {
+ if (am.getAnnotationType().asElement().equals(
+ compilationInfo.getElements().getTypeElement(NAMED_ARG))) {
+ for (Entry<? extends ExecutableElement, ? extends AnnotationValue> entry
+ : am.getElementValues().entrySet()) {
+ if (entry.getKey().getSimpleName().toString().equals("value")) { // NOI18N
+ props1.add((String)entry.getValue().getValue());
+ continue CHECK_PARAMS;
+ }
+ }
+ }
+ }
+ // a parameters wasn't NAMED_ARG; skip this constructor.
+ continue CHECK_CONSTR;
+ }
+ if (propsConstructor.size() < props1.size()) {
+ propsConstructor = new HashSet<>(props1);
+ }
+ }
+
+ if (propsConstructor.isEmpty()) {
+ return;
+ }
+
+ // problem if not all constructor args are covered?
+ boolean fxInstance = false;
+ for (ExecutableElement m : getters) {
+ String n = getPropertyName(m.getSimpleName().toString());
+ if (propsConstructor.contains(n)) {
+ addGetterOnlyProperty(m, n);
+ fxInstance = true;
+ }
+ }
+ resultInfo.setFxInstance(fxInstance);
+ }
+
+ private void addGetterOnlyProperty(ExecutableElement m, String propName) {
+ TypeMirror returnType = m.getReturnType();
+ boolean simple = FxClassUtils.isSimpleType(returnType, compilationInfo);
+
+ // Could only accept simple?
+
+ FxProperty pi = new FxProperty(propName, FxDefinitionKind.GETTER);
+ pi.setAccessor(ElementHandle.create(m));
+ pi.setSimple(simple);
+ pi.setType(TypeMirrorHandle.create(returnType));
+ pi.setObservableAccessors(pi.getAccessor());
+
+ registerProperty(pi);
}
private static final String EVENT_TYPE_NAME = "javafx.event.Event"; // NOI18N
diff --git a/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/FxDefinitionKind.java b/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/FxDefinitionKind.java
index c361bd3..39dc733 100644
--- a/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/FxDefinitionKind.java
+++ b/javafx/javafx2.editor/src/org/netbeans/modules/javafx2/editor/completion/beans/FxDefinitionKind.java
@@ -48,6 +48,11 @@ public enum FxDefinitionKind {
LIST,
/**
+ * Readonly/immutable object, type is getter return type.
+ */
+ GETTER,
+
+ /**
* Attached property
*/
ATTACHED;
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists