Package me.pixodro.j2cpp.core.info

Source Code of me.pixodro.j2cpp.core.info.FieldDeclarationInfo

package me.pixodro.j2cpp.core.info;

import java.util.HashMap;
import java.util.Map;

import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNodeFactory;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.VariableDeclarationFragment;

/**
* User: bquenin
* Date: 27/06/12
* Time: 19:52
*/
public class FieldDeclarationInfo {
  private static final CPPNodeFactory f = CPPNodeFactory.getDefault();

  private final IASTSimpleDeclaration declaration;
  private final ModifiersInfo modifiers;
  private TypeInfo typeInfo;
  private final Map<IASTName, IASTExpression> fragments = new HashMap<IASTName, IASTExpression>();
  private final FieldDeclaration fieldDeclaration;

  private CompilationUnitInfo compilationUnitInfo;

  public FieldDeclarationInfo(final IASTSimpleDeclaration declaration, final ModifiersInfo modifiers) {
    this.declaration = declaration;
    this.modifiers = modifiers;
    fieldDeclaration = null;
  }

  public FieldDeclarationInfo(final FieldDeclaration fieldDeclaration, final CompilationUnitInfo compilationUnitInfo) {
    this.fieldDeclaration = fieldDeclaration;
    this.compilationUnitInfo = compilationUnitInfo;
    modifiers = new ModifiersInfo(fieldDeclaration.modifiers());
    typeInfo = new TypeInfo(fieldDeclaration.getType(), compilationUnitInfo);

    final IASTDeclSpecifier declSpecifier = typeInfo.getDeclSpecifier();
    declaration = convertFragments(declSpecifier);

    if (modifiers.isStatic && modifiers.isFinal) {
      declSpecifier.setStorageClass(IASTDeclSpecifier.sc_static);
      declSpecifier.setConst(true);
    }
    if (modifiers.isStatic) {
      declSpecifier.setStorageClass(IASTDeclSpecifier.sc_static);
    }
  }

  private IASTSimpleDeclaration convertFragments(final IASTDeclSpecifier declSpecifier) {
    final IASTSimpleDeclaration simpleDeclaration = f.newSimpleDeclaration(declSpecifier);
    for (final Object fragmentObject : fieldDeclaration.fragments()) {
      final VariableDeclarationFragment fragment = (VariableDeclarationFragment) fragmentObject;
      final VariableDeclarationFragmentInfo fragmentInfo = new VariableDeclarationFragmentInfo(fragment, fieldDeclaration.getType(), compilationUnitInfo);
      fragments.put(new NameInfo(fragment.getName()).getName(), fragmentInfo.initializer);
      final ITypeBinding typeBinding = fieldDeclaration.getType().resolveBinding();
      if ((fragmentInfo.getDeclarator().getInitializer() == null) && !new TypeInfo(fieldDeclaration.getType(), compilationUnitInfo).isStl() && !typeBinding.isEnum()) {
        fragmentInfo.getDeclarator().setInitializer(f.newEqualsInitializer(typeInfo.getJavaDefaultValue()));
      }
      simpleDeclaration.addDeclarator(fragmentInfo.getDeclarator());
    }
    return simpleDeclaration;
  }

  public IASTSimpleDeclaration getDeclaration() {
    return declaration;
  }

  public ModifiersInfo getModifiers() {
    return modifiers;
  }

  public TypeInfo getTypeInfo() {
    return typeInfo;
  }

  public Map<IASTName, IASTExpression> getFragments() {
    return fragments;
  }

  public FieldDeclaration getFieldDeclaration() {
    return fieldDeclaration;
  }
}
TOP

Related Classes of me.pixodro.j2cpp.core.info.FieldDeclarationInfo

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.