/*
 * Copyright (c) 2012 Google Inc.
 *
 * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
 * Public License v1.0 which accompanies this distribution, and is available at
 *
 * http://www.eclipse.org/legal/epl-v10.html
 */
package com.google.eclipse.protobuf;

import org.eclipse.emf.ecore.*;
import org.eclipse.xtext.GeneratedMetamodel;
import org.eclipse.xtext.xtext.ecoreInference.IXtext2EcorePostProcessor;

/**
 * @author alruiz@google.com (Alex Ruiz)
 */
@SuppressWarnings("restriction")
public class ProtobufEcorePostProcessor implements IXtext2EcorePostProcessor {

  @Override public void process(GeneratedMetamodel metamodel) {
    EPackage p = metamodel.getEPackage();
    for (EClassifier c : p.getEClassifiers()) {
      if (c instanceof EClass && "Literal".equals(c.getName())) {
        processLiteralClass((EClass) c);
      }
    }
  }

  private void processLiteralClass(EClass c) {
    for (EAttribute a : c.getEAllAttributes()) {
      if ("index".equals(a.getName())) {
        a.setDefaultValue(-1L);
        break;
      }
    }
  }
}
