StringLiteral.java :  » IDE-Eclipse » jdt » org » eclipse » jdt » internal » compiler » ast » Java Open Source

Java Open Source » IDE Eclipse » jdt 
jdt » org » eclipse » jdt » internal » compiler » ast » StringLiteral.java
/*******************************************************************************
 * 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.compiler.ast;

import org.eclipse.jdt.internal.compiler.ASTVisitor;
import org.eclipse.jdt.internal.compiler.codegen.CodeStream;
import org.eclipse.jdt.internal.compiler.impl.StringConstant;
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;

public class StringLiteral extends Literal {

  char[] source;
  int lineNumber;

  public StringLiteral(char[] token, int start, int end, int lineNumber) {

    this(start,end);
    this.source = token;
    this.lineNumber = lineNumber - 1; // line number is 1 based
  }

  public StringLiteral(int s, int e) {

    super(s,e);
  }

  public void computeConstant() {

    this.constant = StringConstant.fromValue(String.valueOf(this.source));
  }

  public ExtendedStringLiteral extendWith(CharLiteral lit){

    //add the lit source to mine, just as if it was mine
    return new ExtendedStringLiteral(this,lit);
  }

  public ExtendedStringLiteral extendWith(StringLiteral lit){

    //add the lit source to mine, just as if it was mine
    return new ExtendedStringLiteral(this,lit);
  }

  /**
   *  Add the lit source to mine, just as if it was mine
   */
  public StringLiteralConcatenation extendsWith(StringLiteral lit) {
    return new StringLiteralConcatenation(this, lit);
  }
  /**
   * Code generation for string literal
   */
  public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {

    int pc = codeStream.position;
    if (valueRequired)
      codeStream.ldc(this.constant.stringValue());
    codeStream.recordPositionsFrom(pc, this.sourceStart);
  }

  public TypeBinding literalType(BlockScope scope) {

    return scope.getJavaLangString();
  }

  public StringBuffer printExpression(int indent, StringBuffer output) {

    // handle some special char.....
    output.append('\"');
    for (int i = 0; i < this.source.length; i++) {
      switch (this.source[i]) {
        case '\b' :
          output.append("\\b"); //$NON-NLS-1$
          break;
        case '\t' :
          output.append("\\t"); //$NON-NLS-1$
          break;
        case '\n' :
          output.append("\\n"); //$NON-NLS-1$
          break;
        case '\f' :
          output.append("\\f"); //$NON-NLS-1$
          break;
        case '\r' :
          output.append("\\r"); //$NON-NLS-1$
          break;
        case '\"' :
          output.append("\\\""); //$NON-NLS-1$
          break;
        case '\'' :
          output.append("\\'"); //$NON-NLS-1$
          break;
        case '\\' : //take care not to display the escape as a potential real char
          output.append("\\\\"); //$NON-NLS-1$
          break;
        default :
          output.append(this.source[i]);
      }
    }
    output.append('\"');
    return output;
  }

  public char[] source() {

    return this.source;
  }

  public void traverse(ASTVisitor visitor, BlockScope scope) {
    visitor.visit(this, scope);
    visitor.endVisit(this, scope);
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.