moonject

package module
v0.0.14 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 10, 2024 License: Apache-2.0 Imports: 17 Imported by: 2

README

Moonject

Moonject is a wrapper library for creating Go preprocessors. It provides functionality to modify Go source code before compilation, enabling users to inject custom logic or make transformations to source files.

Usage

Moonject allows you to create custom preprocessors by defining a struct that satisfies the Modifier interface. This interface has only one method, Modify, which accepts a (*dst.File, *decorator.Decorator, *decorator.Restorer) representing the AST of a Go source file, file decorator and imports restorer. This method must return a modified *dst.File.

Process Function

The moonject.Process function represents the generalized approach to preprocessing Go code. It performs the following steps:

  1. Checks if we are at the right stage of compilation.
  2. If not, runs the original command and returns.
  3. Extracts the files that Go is about to compile.
  4. Makes changes to the AST of all the files (without modifying the source code).
  5. Writes the modified files to a temporary directory.
  6. Resolves all missing imports that were added as part of the modification.
  7. Substitutes the path to the original files with the path to the modified files and passes them to the compiler command.
  8. Runs the original command with the substituted files to be compiled.

Example

Here's an example of how you can use Moonject to modify a Go source file:

package main

import (
	"github.com/pijng/moonject"
)

// CustomModifier implements the Modifier interface
type CustomModifier struct{}

// Modify implements the Modify method of the Modifier interface
func (cm CustomModifier) Modify(f *dst.File, dec *decorator.Decorator, res *decorator.Restorer) *dst.File {
	// Add custom modification logic here
	return f
}

func main() {
	// Call moonject.Process with an instance of your modifier struct
	moonject.Process(CustomModifier{})
}

In this example, CustomModifier is a struct that satisfies the Modifier interface. It implements the Modify method, where you can define your custom modification logic.

Demonstration

  • moonjectlog: moonjectlog is a preprocessor that inserts a simple fmt.Println statement at the beginning of each function in a Go project. It demonstrates the usage of Moonject for injecting custom logic into source files.
  • go-ifdef: go-ifdef is a preprocessor that allows you to use trivial #ifdef and #else directives based on the GOOS environment variable.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Process

func Process(modifier Modifier)

How to use this library to build you own preprocessor:

  1. Create a new project for your own preprocessor.

  2. Define a struct that will satisfy Modifier interface. Modifier has only one method [Modify] that must accept (*dst.File, *decorator.Decorator, *decorator.Restorer) as arguments, and must return a modified *dst.File.

    All the modifications you want to make should be called inside your Modify method.

  3. In a main function of your preprocessor project simply call:

    moonject.Process(YourModifierStruct{})

  4. Build your preprocessor with just a `go build`

  5. Call a newly compiled preprocessor on your target project like this:

    go build -a -toolexec="absolute/path/to/your/preprocessor/binary $PWD" main.go

IMPORTANT: pay attention to the -a flag in the above command. It is required to call compilation of all project files. Otherwise go compiler will not compile files that have not been changed since the last compilation. So if you make changes to injector.go and then try to call it as a preprocessor when compiling your project code, the go compiler may not make the changes you need if you have not changed the project code since the last compilation.

IMPORTANT: pay attention to $PWD argument in the above command. When calling your preprocessor, you must specify the absolute path to the root of the project you want to compile as the first argument. If you call go build in the root of the project, it is sufficient to specify $PWD.

Process function represents the generalized approach to preprocessing go code. It:

  1. Checks if we are at the right stage of compilation;
  2. If not, runs the original command and return;
  3. Extract the files that go is about to compile;
  4. Make the changes to the AST of all the files (this won't affect the source code);
  5. Writes the modified files to the temporary directory;
  6. Resolve all missing imports that were added as part of the modification;
  7. Substitutes the path to the original files with the path to modified files and pass them to the compiler command;
  8. Runs the original command with an already substituted files to be compiled.

Types

type Modifier

type Modifier interface {
	Modify(*dst.File, *decorator.Decorator, *decorator.Restorer) *dst.File
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL