/*******************************************************************************
 * Copyright (c) 2000, 2020 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Fraunhofer FIRST - extended API and implementation
 *     Technical University Berlin - extended API and implementation
 *******************************************************************************/
package org.eclipse.jdt.internal.compiler.ast;

import java.util.HashSet;
import java.util.Set;

import org.eclipse.jdt.internal.compiler.ASTVisitor;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.eclipse.jdt.internal.compiler.lookup.*;

/**
 * OTDT changes:
 *
 * What: Support the new modifier "team" for package declarations.
 *
 * What: Support "import base".
 *
 * @version $Id: ImportReference.java 19881 2009-04-13 23:35:46Z stephan $
 */
public class ImportReference extends ASTNode {

	public char[][] tokens;
	public long[] sourcePositions; //each entry is using the code : (start<<32) + end
	public int declarationEnd; // doesn't include an potential trailing comment
	public int declarationSourceStart;
	public int declarationSourceEnd;
	public int modifiers; // 1.5 addition for static imports
	public Annotation[] annotations;
	// star end position
	public int trailingStarPosition;

//{ObjectTeams:
	public int baseModifierPosition;
//  new queries:
	public boolean isTeam() {
		return (this.modifiers & ExtraCompilerModifiers.AccTeam) != 0;
	}
	public boolean isBase() {
		return (this.modifiers & ExtraCompilerModifiers.AccBase) != 0;
	}
// SH}


	public ImportReference(
			char[][] tokens,
			long[] sourcePositions,
			boolean onDemand,
			int modifiers) {

		this.tokens = tokens;
		this.sourcePositions = sourcePositions;
		if (onDemand) {
			this.bits |= ASTNode.OnDemand;
		}
		this.sourceEnd = (int) (sourcePositions[sourcePositions.length-1] & 0x00000000FFFFFFFF);
		this.sourceStart = (int) (sourcePositions[0] >>> 32);
		this.modifiers = modifiers;
	}

	public boolean isStatic() {
		return (this.modifiers & ClassFileConstants.AccStatic) != 0;
	}

	public char[][] getImportName() {
		return this.tokens;
	}

	public char[] getSimpleName() {
		return this.tokens[this.tokens.length - 1];
	}

	public void checkPackageConflict(CompilationUnitScope scope) {
		ModuleBinding module = scope.module();
		PackageBinding visiblePackage = module.getVisiblePackage(this.tokens);
		if (visiblePackage instanceof SplitPackageBinding) {
			Set<ModuleBinding> declaringMods = new HashSet<>();
			for (PackageBinding incarnation : ((SplitPackageBinding) visiblePackage).incarnations) {
				if (incarnation.enclosingModule != module && module.canAccess(incarnation))
					declaringMods.add(incarnation.enclosingModule);
			}
			if (!declaringMods.isEmpty()) {
				CompilerOptions compilerOptions = scope.compilerOptions();
				boolean inJdtDebugCompileMode = compilerOptions.enableJdtDebugCompileMode;
				if (!inJdtDebugCompileMode) {
					scope.problemReporter().conflictingPackagesFromOtherModules(this, declaringMods);
				}
			}
		}
	}

	@Override
	public StringBuffer print(int indent, StringBuffer output) {

		return print(indent, output, true);
	}

	public StringBuffer print(int tab, StringBuffer output, boolean withOnDemand) {
		/* when withOnDemand is false, only the name is printed */
		for (int i = 0; i < this.tokens.length; i++) {
			if (i > 0) output.append('.');
			output.append(this.tokens[i]);
		}
		if (withOnDemand && ((this.bits & ASTNode.OnDemand) != 0)) {
			output.append(".*"); //$NON-NLS-1$
		}
		return output;
	}

	public void traverse(ASTVisitor visitor, CompilationUnitScope scope) {
		// annotations are traversed during the compilation unit traversal using a class scope
		visitor.visit(this, scope);
		visitor.endVisit(this, scope);
	}
}
