github.com/tardisgo/tardisgo@v0.0.0-20161119180838-e0dd9a7e46b5/pogo/multifile.go (about)

     1  package pogo
     2  
     3  import (
     4  	"bytes"
     5  	"io/ioutil"
     6  	"os"
     7  )
     8  
     9  func writeIfChanged(filename string, data []byte) error {
    10  	content, err := ioutil.ReadFile(filename)
    11  	if err == nil {
    12  		if bytes.Equal(content, data) {
    13  			//println("DEBUG writeIfChanged() unchanged: " + filename)
    14  			return nil
    15  		}
    16  	}
    17  	//println("DEBUG writeIfChanged() changed: " + filename) // TODO add a flag to show this
    18  	return ioutil.WriteFile(filename, data, 0666)
    19  }
    20  
    21  // WriteAsClass writes the contents of the buffer as a given class file name.
    22  func (comp *Compilation) WriteAsClass(name, code string) {
    23  	l := comp.TargetLang
    24  	if LanguageList[l].files == nil {
    25  		LanguageList[l].files = make([]FileOutput, 0, 100)
    26  	}
    27  	_, err := LanguageList[l].buffer.WriteString(code)
    28  	if err != nil {
    29  		panic(err)
    30  	}
    31  	var data = make([]byte, LanguageList[l].buffer.Len())
    32  	copy(data, LanguageList[l].buffer.Bytes())
    33  	LanguageList[l].files = append(LanguageList[l].files, FileOutput{name, data})
    34  	LanguageList[l].buffer.Reset()
    35  	comp.emitFileStart()
    36  }
    37  
    38  func (comp *Compilation) targetDir() error {
    39  	if err := os.Mkdir(LanguageList[comp.TargetLang].TgtDir, os.ModePerm); err != nil {
    40  		if !os.IsExist(err) { // no problem if it already exists
    41  			comp.LogError("Unable to create tardis output directory", "pogo", err)
    42  			return err
    43  		}
    44  	}
    45  	return nil
    46  }
    47  
    48  // Write out the target language file
    49  func (comp *Compilation) writeFiles() {
    50  	l := comp.TargetLang
    51  	if LanguageList[l].buffer.Len() > 0 {
    52  		comp.WriteAsClass("Remnants", "")
    53  	}
    54  	err := comp.targetDir()
    55  	if err == nil {
    56  		for _, fo := range LanguageList[l].files {
    57  			err = writeIfChanged(
    58  				LanguageList[comp.TargetLang].TgtDir+
    59  					string(os.PathSeparator)+fo.filename+
    60  					LanguageList[l].FileTypeSuffix(),
    61  				fo.data)
    62  			if err != nil {
    63  				break
    64  			}
    65  		}
    66  	}
    67  	if err != nil {
    68  		comp.LogError("Unable to write output file", "pogo", err)
    69  	}
    70  }