Git Product home page Git Product logo

kpp's Introduction

KPP

KPP is a kotlin pre-processor developed in Kotlin DSL (kotlin build script) for android studio and the kotlin language

it is currently in beta as it is not fully functional yet

UNDER CONSTRUCTION

TODO

  • improve documentation
  • publish plugin
  • figure out how to include this in other projects
  • improve installation and usage information
  • figure out how to hook gradle syntax analysis to provide autocompletion for directives and macros

what works?

  • #define is fully functional

what does not work?

  • #undef
  • stringilization : #define tostring(x) #x
  • token concation : #define cat(a,b) a##b
  • predefined macros : __FILE__, __LINE__, and others
  • #ifdef
  • #endif
  • #if
  • #else
  • #fi
  • any other directives i may have missed

old README.md

how do i use kpp?

in project root

git clone https://github.com/mgood7123/kpp

by default, kpp's install directory is hardcoded to ProjectRoot/kpp, eg /home/superlock/AndroidStudioProjects/AudioEvolved/kpp where AudioEvolved is the ProjectRoot

in module you wish kpp to operate on

for example, if i want KPP to process all files in /home/superlock/AndroidStudioProjects/AudioEvolved/app, i would append

apply from: '../kpp/build.gradle.kts'

preBuild.dependsOn KOTLIN_PRE_PROCESSOR

to /home/superlock/AndroidStudioProjects/AudioEvolved/app/build.gradle

how it works

the internals of kpp are simple

first, it operates on the following rules:

in order to explain we need to assume something first

src = /home/superlock/AndroidStudioProjects/AudioEvolved/app/src/main/java/start_of_email/smallville7123/at/gmail/com/end_of_email/apps/audioevolved/UI.kt

dest = /home/superlock/AndroidStudioProjects/AudioEvolved/kpp/src/main/java/start_of_email/smallville7123/at/gmail/com/end_of_email/apps/audioevolved/UI.kt

when src is about to be scanned, it first checks for the existence of dest

if dest exist, kpp will process dest

if dest does not exist, it will scan src
    if src contains any pre-processing information such as #defines, kpp will move src to dest, overwriting it if it exists
    if src does not contain pre-processing info, kpp will leave src alone

if dest no longer contains pre-processing info, kpp will copy dest back to src, overwriting src

after it has found files with pre-processing information, those files are kept in kpp's internal folder and any changes to the src will no longer be effective, this is explained after

when kpp processes files in its internal folder, any changes made to any file are automatically applied to the original src of that file

for example:

if you have a

#define a b

in src, kpp will copy src to dest, process dest to dest.preprocessed.kt, then copy dest.preprocessed.kt to src, overwriting src

if you delete the contents of src, but not src itself, the contents of src is restored when kpp processes dest

if you modify dest, src will also be modified accordingly

if dest no longer contains

#define a b

dest will be moved to src, and its files removed from the kpp folder

if you delete the contents of dest, the src will also have its contents deleted, and dest will be deleted as it has no pre-processing information such as #define due to the fact dest is now empty

given this, the verbose log of KPP is maintained in the Build tabs console view, and depending on your build file, is the very first task executed

ones build might look like this

sync failed	19 s 923 ms
Run build	19 s 279 ms
    Load build	161 ms
        Run init scripts	145 ms
        Evaluate settings	16 ms
    Configure build	19 s 49 ms
        Load projects	14 ms
        Configure project :	711 ms
            Register task :init
            Register task :wrapper	1 ms
        Configure project :app	18 s 302 ms

> Configure project :app
starting KOTLIN_PRE_PROCESSOR
using preprocessing examples.kt in kpp/src
registered macro definition for preprocessing examples.kt at index 1
processing preprocessing examples.kt -> preprocessing examples.kt.preprocessed.kt
preprocessing examples.kt: preprocessor directive: define
preprocessing examples.kt: preprocessor line: #define foob(X,                 y                 ,               Z             )              bar X y Z
text : (X,                 y                 ,               Z             )
extracting arguments for X,                 y                 ,               Z
Arguments List = [X, y, Z]
expanding line '             bar X y Z'
tokens to ignore : [ , (, ), ., ,, -, >]
tokenization : [ ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  ,  , bar,  , X,  , y,  , Z]
expanded string :              bar X y Z
Type       = function
Token      = foob
Arguments  = [X, y, Z]
Value      =              bar X y Z
LISTING MACROS
[0].FullMacro  = #define foob(X,                 y                 ,               Z             )              bar X y Z
[0].Type       = function
[0].Token      = foob
[0].Arguments  = [X, y, Z]
[0].Value      =              bar X y Z
LISTED MACROS
expanding line 'foob a(1,2,3) // object'
tokens to ignore : [ , (, ), ., ,, -, >]
tokenization : [foob,  , a, (, 1, ,, 2, ,, 3, ),  , //,  , object]
foob of type matches foob
token list     = foob
determining if foob is a function or an object
foob is an object
foob of type function has value              bar X y Z
foob of type function does not match a
foob of type function does not match 1
foob of type function does not match 2
foob of type function does not match 3
foob of type function does not match //
foob of type function does not match object
expanded string :              bar X y Z a(1,2,3) // object
expanding line 'foob (1,2,3) // function'
tokens to ignore : [ , (, ), ., ,, -, >]
tokenization : [foob,  , (, 1, ,, 2, ,, 3, ),  , //,  , function]
foob of type matches foob
token list     = foob
determining if foob is a function or an object
foob is a function
token list [2] = (
foob of type function has value              bar X y Z
foob of type function does not match 1
foob of type function does not match 2
foob of type function does not match 3
foob of type function does not match //
foob of type function does not match function
expanded string : foob (1,2,3) // function
expanding line 'foob(1,2,3) // function'
tokens to ignore : [ , (, ), ., ,, -, >]
tokenization : [foob, (, 1, ,, 2, ,, 3, ),  , //,  , function]
foob of type matches foob
token list     = foob
determining if foob is a function or an object
foob is a function
token list [1] = (
foob of type function has value              bar X y Z
foob of type function does not match 1
foob of type function does not match 2
foob of type function does not match 3
foob of type function does not match //
foob of type function does not match function
expanded string : foob(1,2,3) // function
expanding line ''
tokens to ignore : [ , (, ), ., ,, -, >]
tokenization : []
expanded string :
preprocessing examples.kt.preprocessed.kt (in kpp/src) copied back to original source
KOTLIN_PRE_PROCESSOR finished

FAILURE: Build failed with an exception.

* Where:
Build file '/home/superlock/AndroidStudioProjects/AudioEvolved/app/build.gradle' line: 39

* What went wrong:
A problem occurred evaluating project ':app'.
> Could not create task ':app:KOTLIN_PRE_PROCESSOR'.
   > Aborted

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

CONFIGURE FAILED in 19s
Aborted
Open File

this is taken at the time of this documents writing, and at the current state of KPP

the Aborted here is intentional as i am only focussing on KPP, and need not actually build the project untill i actually get kpp to be stable, in which i will start implementing kotlin specific pre-processor directives

java is also going to be supported, but for now i am focusing on kotlin

implemented

#define ( define directive fully supports object like macros, and function like macros )

yet to be implemented

#undef

stringilization : #define tostring(x) #x

token concation : #define cat(a,b) a##b

predefined macros : __FILE__, __LINE__, and others

#ifdef

#endif

#if

#else

#fi

any other directives i may have missed

why not just use cpp

cpp is intended for C, C#, and C++ and as such produces unwanted text in its output, such as #line directives, aswell as not properly supporting the kotlin language (using cpp on anything other than the C language set is considered abuse of the preprocessor, and may result in unintended side effects

kpp's People

Contributors

gildor avatar mgood7123 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

gildor

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.