/******************************************************************************* * Copyright (c) 2000, 2009 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.core.builder; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.CoreException; import org.eclipse.jdt.core.compiler.CharOperation; import org.eclipse.jdt.internal.compiler.env.ICompilationUnit; import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; import org.eclipse.jdt.internal.core.util.Util; public class SourceFile implements ICompilationUnit { public IFile resource; ClasspathMultiDirectory sourceLocation; String initialTypeName; boolean updateClassFile; public SourceFile(IFile resource, ClasspathMultiDirectory sourceLocation) { this.resource = resource; this.sourceLocation = sourceLocation; this.initialTypeName = extractTypeName(); this.updateClassFile = false; } public SourceFile(IFile resource, ClasspathMultiDirectory sourceLocation, boolean updateClassFile) { this(resource, sourceLocation); this.updateClassFile = updateClassFile; } public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof SourceFile)) return false; SourceFile f = (SourceFile) o; return this.sourceLocation == f.sourceLocation && this.resource.getFullPath().equals(f.resource.getFullPath()); } String extractTypeName() { // answer a String with the qualified type name for the source file in the form: 'p1/p2/A' IPath fullPath = this.resource.getFullPath(); int resourceSegmentCount = fullPath.segmentCount(); int sourceFolderSegmentCount = this.sourceLocation.sourceFolder.getFullPath().segmentCount(); int charCount = (resourceSegmentCount - sourceFolderSegmentCount - 1); resourceSegmentCount--; // deal with the last segment separately for (int i = sourceFolderSegmentCount; i < resourceSegmentCount; i++) charCount += fullPath.segment(i).length(); String lastSegment = fullPath.segment(resourceSegmentCount); int extensionIndex = Util.indexOfJavaLikeExtension(lastSegment); charCount += extensionIndex; char[] result = new char[charCount]; int offset = 0; for (int i = sourceFolderSegmentCount; i < resourceSegmentCount; i++) { String segment = fullPath.segment(i); int size = segment.length(); segment.getChars(0, size, result, offset); offset += size; result[offset++] = '/'; } lastSegment.getChars(0, extensionIndex, result, offset); return new String(result); } public char[] getContents() { try { return Util.getResourceContentsAsCharArray(this.resource); } catch (CoreException e) { throw new AbortCompilation(true, new MissingSourceFileException(this.resource.getFullPath().toString())); } } /** * @see org.eclipse.jdt.internal.compiler.env.IDependent#getFileName() */ public char[] getFileName() { return this.resource.getFullPath().toString().toCharArray(); // do not know what you want to return here } public char[] getMainTypeName() { char[] typeName = this.initialTypeName.toCharArray(); int lastIndex = CharOperation.lastIndexOf('/', typeName); return CharOperation.subarray(typeName, lastIndex + 1, -1); } public char[][] getPackageName() { char[] typeName = this.initialTypeName.toCharArray(); int lastIndex = CharOperation.lastIndexOf('/', typeName); return CharOperation.splitOn('/', typeName, 0, lastIndex); } public int hashCode() { return this.initialTypeName.hashCode(); } String typeLocator() { return this.resource.getProjectRelativePath().toString(); } public String toString() { return "SourceFile[" //$NON-NLS-1$ + this.resource.getFullPath() + "]"; //$NON-NLS-1$ } }