Java Code Examples for com.intellij.psi.PsiClass#getChildren()

The following examples show how to use com.intellij.psi.PsiClass#getChildren() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: AbstractPropertiesProvider.java    From intellij-quarkus with Eclipse Public License 2.0 5 votes vote down vote up
/**
 * Get or create the update hint from the given type.
 * 
 * @param collector
 * @param type      the type.
 * @return the hint name.
 */
protected String updateHint(IPropertiesCollector collector, PsiClass type) {
	if (type == null) {
		return null;
	}
	if (type.isEnum()) {
		// Register Enumeration in "hints" section
		//String hint = ClassUtil.getJVMClassName(type);
		String hint = type.getQualifiedName();
		if (!collector.hasItemHint(hint)) {
			ItemHint itemHint = collector.getItemHint(hint);
			itemHint.setSourceType(hint);
			if (type instanceof PsiClassImpl) {
				itemHint.setSource(Boolean.TRUE);
			}
			PsiElement[] children = type.getChildren();
			for (PsiElement c : children) {
				if (c instanceof PsiEnumConstant) {
					String enumName = ((PsiEnumConstant) c).getName();
					// TODO: extract Javadoc
					String description = null;
					ValueHint value = new ValueHint();
					value.setValue(enumName);
					itemHint.getValues().add(value);
				}
			}
		}
		return hint;
	}
	return null;
}
 
Example 2
Source File: MicroProfileRestClientDiagnosticsParticipant.java    From intellij-quarkus with Eclipse Public License 2.0 5 votes vote down vote up
private static void validateClassType(PsiClass classType, List<Diagnostic> diagnostics, JavaDiagnosticsContext context) {
	for (PsiElement element : classType.getChildren()) {
		if (element instanceof PsiField) {
			PsiField field = (PsiField) element;
			validateField(field, diagnostics, context);
		}
	}
}
 
Example 3
Source File: QuarkusConfigPropertiesProvider.java    From intellij-quarkus with Eclipse Public License 2.0 4 votes vote down vote up
private void processConfigProperties(PsiModifierListOwner psiElement, PsiAnnotation configPropertiesAnnotation,
									 ConfigPropertiesContext configPropertiesContext, IPropertiesCollector collector) {
	if (!(psiElement instanceof PsiClass)) {
		return;
	}
	PsiClass configPropertiesType = (PsiClass) psiElement;
	// Location (JAR, src)
	VirtualFile packageRoot = PsiTypeUtils.getRootDirectory(psiElement);
	String location = PsiTypeUtils.getLocation(psiElement.getProject(), packageRoot);
	// Quarkus Extension name
	String extensionName = PsiQuarkusUtils.getExtensionName(location);

	String prefix = determinePrefix(configPropertiesType, configPropertiesAnnotation);
	if (configPropertiesType.isInterface()) {
		// See
		// https://github.com/quarkusio/quarkus/blob/0796d712d9a3cf8251d9d8808b705f1a04032ee2/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/configproperties/InterfaceConfigPropertiesUtil.java#L89
		List<PsiClass> allInterfaces = new ArrayList(Arrays.asList(findInterfaces(configPropertiesType)));
		allInterfaces.add(0, configPropertiesType);

		for (PsiClass configPropertiesInterface : allInterfaces) {
			// Loop for each methods.
			PsiElement[] elements = configPropertiesInterface.getChildren();
			// Loop for each fields.
			for (PsiElement child : elements) {
				if (child instanceof PsiMethod) {
					PsiMethod method = (PsiMethod) child;
					if (method.getModifierList().hasExplicitModifier(PsiModifier.DEFAULT)) { // don't do anything with default methods
						continue;
					}
					if (method.hasParameters()) {
						LOGGER.info("Method " + method.getName() + " of interface "
										+ method.getContainingClass().getQualifiedName()
										+ " is not a getter method since it defined parameters");
						continue;
					}
					if (PsiType.VOID.equals(method.getReturnType())) {
						LOGGER.info("Method " + method.getName() + " of interface "
										+ method.getContainingClass().getQualifiedName()
										+ " is not a getter method since it returns void");
						continue;
					}
					String name = null;
					String defaultValue = null;
					PsiAnnotation configPropertyAnnotation = AnnotationUtils.getAnnotation(method,
							QuarkusConstants.CONFIG_PROPERTY_ANNOTATION);
					if (configPropertyAnnotation != null) {
						name = getAnnotationMemberValue(configPropertyAnnotation,
								QuarkusConstants.CONFIG_PROPERTY_ANNOTATION_NAME);
						defaultValue = getAnnotationMemberValue(configPropertyAnnotation,
								QuarkusConstants.CONFIG_PROPERTY_ANNOTATION_DEFAULT_VALUE);
					}
					if (name == null) {
						name = getPropertyNameFromMethodName(method);
					}
					if (name == null) {
						continue;
					}

					String propertyName = prefix + "."
							+ convertName(name, method, configPropertiesAnnotation, configPropertiesContext);
					String methodResultTypeName = PsiTypeUtils.getResolvedResultTypeName(method);
					PsiClass returnType = PsiTypeUtils.findType(method.getManager(), methodResultTypeName);

					// Method result type
					String type = PsiTypeUtils.getPropertyType(returnType, methodResultTypeName);

					// TODO: extract Javadoc from Java sources
					String description = null;

					// Method source
					String sourceType = PsiTypeUtils.getSourceType(method);
					String sourceMethod = PsiTypeUtils.getSourceMethod(method);

					// Enumerations
					super.updateHint(collector, returnType);

					if (PsiTypeUtils.isSimpleFieldType(returnType, methodResultTypeName)) {
						ItemMetadata metadata = super.addItemMetadata(collector, propertyName, type, description, sourceType, null,
								sourceMethod, defaultValue, extensionName, PsiTypeUtils.isBinary(method));
						PsiQuarkusUtils.updateConverterKinds(metadata, method, returnType);
					} else {
						populateConfigObject(returnType, propertyName, extensionName, new HashSet(), configPropertiesAnnotation, configPropertiesContext, collector);
					}

				}
			}
		}
	} else {
		// See
		// https://github.com/quarkusio/quarkus/blob/e8606513e1bd14f0b1aaab7f9969899bd27c55a3/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/configproperties/ClassConfigPropertiesUtil.java#L117
		// TODO : validation
		populateConfigObject(configPropertiesType, prefix, extensionName, new HashSet<>(), configPropertiesAnnotation, configPropertiesContext, collector);
	}
}
 
Example 4
Source File: QuarkusConfigPropertiesProvider.java    From intellij-quarkus with Eclipse Public License 2.0 4 votes vote down vote up
private void populateConfigObject(PsiClass configPropertiesType, String prefixStr, String extensionName,
								  Set<PsiClass> typesAlreadyProcessed, PsiAnnotation configPropertiesAnnotation,
								  ConfigPropertiesContext configPropertiesContext, IPropertiesCollector collector) {
	if (typesAlreadyProcessed.contains(configPropertiesType)) {
		return;
	}
	typesAlreadyProcessed.add(configPropertiesType);
	PsiElement[] elements = configPropertiesType.getChildren();
	// Loop for each fields.
	for (PsiElement child : elements) {
		if (child instanceof PsiField) {
			// The following code is an adaptation for JDT of
			// Quarkus arc code:
			// https://github.com/quarkusio/quarkus/blob/e8606513e1bd14f0b1aaab7f9969899bd27c55a3/extensions/arc/deployment/src/main/java/io/quarkus/arc/deployment/configproperties/ClassConfigPropertiesUtil.java#L211
			PsiField field = (PsiField) child;
			boolean useFieldAccess = false;
			String setterName = JavaBeanUtil.getSetterName(field.getName());
			String configClassInfo = configPropertiesType.getQualifiedName();
			PsiMethod setter = findMethod(configPropertiesType, setterName, field.getType());
			if (setter == null) {
				if (!field.getModifierList().hasModifierProperty(PsiModifier.PUBLIC) || field.getModifierList().hasModifierProperty(PsiModifier.FINAL)) {
					LOGGER.info("Configuration properties class " + configClassInfo
									+ " does not have a setter for field " + field
									+ " nor is the field a public non-final field");
					continue;
				}
				useFieldAccess = true;
			}
			if (!useFieldAccess && !setter.getModifierList().hasModifierProperty(PsiModifier.PUBLIC)) {
				LOGGER.info("Setter " + setterName + " of class " + configClassInfo + " must be public");
				continue;
			}

			String name = field.getName();
			// The default value is managed with assign like : 'public String suffix = "!"';
			// Getting "!" value is possible but it requires to re-parse the Java file to
			// build a DOM CompilationUnit to extract assigned value.
			final String defaultValue = null;
			String propertyName = prefixStr + "." + convertName(name, field, configPropertiesAnnotation, configPropertiesContext);

			String fieldTypeName = PsiTypeUtils.getResolvedTypeName(field);
			PsiClass fieldClass = PsiTypeUtils.findType(field.getManager(), fieldTypeName);
			if (PsiTypeUtils.isSimpleFieldType(fieldClass, fieldTypeName)) {

				// Class type
				String type = PsiTypeUtils.getPropertyType(fieldClass, fieldTypeName);

				// Javadoc
				String description = null;

				// field and class source
				String sourceType = PsiTypeUtils.getSourceType(field);
				String sourceField = PsiTypeUtils.getSourceField(field);

				// Enumerations
				super.updateHint(collector, fieldClass);

				ItemMetadata metadata = super.addItemMetadata(collector, propertyName, type, description, sourceType, sourceField, null,
						defaultValue, extensionName, PsiTypeUtils.isBinary(field));
				PsiQuarkusUtils.updateConverterKinds(metadata, field, fieldClass);
			} else {
				populateConfigObject(fieldClass, propertyName, extensionName, typesAlreadyProcessed, configPropertiesAnnotation, configPropertiesContext, collector);
			}
		}
	}
}