content: /**
   *  Copyright (c) 2013-2016 Angelo ZERR and Genuitec LLC.s
   *  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
   *
   *  Contributors:
   *  Angelo Zerr <angelo.zerr@gmail.com> - initial API and implementation
   *  Piotr Tomiak <piotr@genuitec.com> - collectors API and code refactoring
   */
  package tern.server.protocol.guesstypes;
  
  import tern.server.protocol.IJSONObjectHelper;
  import tern.server.protocol.ITernResultProcessor;
  import tern.server.protocol.TernDoc;
  import tern.server.protocol.completions.TernCompletionProposalRec;
  
  public class TernGuessTypesResultProcessor implements ITernResultProcessor<ITernGuessTypesCollector> {
  
  	public static final TernGuessTypesResultProcessor INSTANCE = new TernGuessTypesResultProcessor();
  
  	/**
  	 * Properties for JSON guess types result.
  	 */
  	private static final String ARGS_FIELD_NAME = "!args";
  	private static final String NAME_PROPERTY = "name"; //$NON-NLS-1$
  	private static final String DISPLAY_NAME_PROPERTY = "displayName"; //$NON-NLS-1$
  	private static final String TYPE_PROPERTY = "type"; //$NON-NLS-1$
  	private static final String DOC_PROPERTY = "doc"; //$NON-NLS-1$
  	private static final String URL_PROPERTY = "url"; //$NON-NLS-1$
  	private static final String ORIGIN_PROPERTY = "origin"; //$NON-NLS-1$
  
  	@Override
  	public void process(TernDoc doc, IJSONObjectHelper objectHelper, Object jsonObject,
  			ITernGuessTypesCollector collector) {
  		Iterable<Object> args = objectHelper.getList(jsonObject, ARGS_FIELD_NAME); // $NON-NLS-1$
  		if (args != null) {
  			Iterable<Object> namesForArg;
  			String[] argTypes = null;
  			String argType = null;
  			int argIndex = 0;
  			for (Object arg : args) {
  				// argument can have multiple types separated with '|'.
  				argTypes = objectHelper.getText(arg).split("[|]");
  				for (int i = 0; i < argTypes.length; i++) {
  					argType= argTypes[i];
  					namesForArg = objectHelper.getList(jsonObject, argType);
  					// It can be null when argument type cannot be guessed. See https://github.com/angelozerr/tern.java/issues/390
  					if (namesForArg != null) {						
  						for (Object argValue : namesForArg) {
  							if (objectHelper.isString(argValue)) {
  								collector.addProposal(argIndex,
  										new TernCompletionProposalRec(objectHelper.getText(argValue),
  												objectHelper.getText(argValue), argType, null, null, null, 0, 0, false, false, false),
  										argValue, objectHelper);
  							} else {
  								addProposal(argIndex, objectHelper, argValue, collector);
  							}
  						}
  					}
  				}
  				argIndex++;
  			}
  		}
  	}
  
  	private void addProposal(int argIndex, IJSONObjectHelper objectHelper, Object completion,
  			ITernGuessTypesCollector collector) {
  		String name = objectHelper.getText(completion, NAME_PROPERTY);
  		String displayName = objectHelper.getText(completion, DISPLAY_NAME_PROPERTY);
  		String type = objectHelper.getText(completion, TYPE_PROPERTY);
  		String doc = objectHelper.getText(completion, DOC_PROPERTY);
  		String url = objectHelper.getText(completion, URL_PROPERTY);
  		String origin = objectHelper.getText(completion, ORIGIN_PROPERTY);
  		collector.addProposal(argIndex,
  				new TernCompletionProposalRec(name, displayName, type, doc, url, origin, 0, 0, false, false, false),
  				completion, objectHelper);
  	}
  }
  