Giter VIP home page Giter VIP logo

corona-ide's Introduction

Corona IDE

GitHub Actions Code Coverage Quality Gate Black Duck Security Risk License

The'I' in IDE should also stand for "invisible"

A exploratory project to build a lighter, simpler Java IDE - or learn trying!

One of the harder parts of developing on a team is getting new members setup for development quickly and consistently. Corona IDE aims to provide a light-weight environment which helps developers do what they need to do, and to do it in a way which is portable and repeatable.

Legal

All assets and code are under the EPL 1.0 License unless otherwise specified

Contributing

See the contribution guidelines for information on contributing to Corona IDE

Libraries Used

Corona IDE is currently written against Java 1.8

Gradle Build Scan

Corona IDE has the plug-ins required for Gradle Build Scan setup. Simply run a build with the -Dscan option, and a build scan will be performed

corona-ide's People

Contributors

nickavv avatar romeara avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Forkers

yevster

corona-ide's Issues

Switch to Electron

Create a spring-shim (eventually into its own library) to allow streamlined use of electron, as JavaFX is being split in JDK 11

Add a store for user preferences

I've run into my first instance of wanting to store an application-level user preference, whether or not to ask for confirmation on quitting the application.

I started mucking around with this but decided it's a larger task than I thought and want to make sure we do it right, so I ticketed it.

Write TestFX tests for things that need clicking

Since I'm doing the JavaFX UI, and I own a 4K monitor, I cannot write certain tests that pass locally until this issue in TestFX is fixed: TestFX/TestFX#245

The types of tests affected by this issue are specifically ones that involve moving the mouse and clicking on certain UI elements, as the mouse moves to the wrong locations.

We need to get this sorted and fix it before too long

Specify Corona Environment Within a Build System

Many OSS projects, if using existing IDEs, have significant setup steps involving installing particular plug-ins and configuring options a specific way. For Corona, allow specification of this environment within a build system (such as Gradle), the same way a project may be configured.

The desired result is for the setup instructions for a project using Corona to be "clone the repository, open a new Corona workspace, import project"

Ability to bookmark groups of open files

If I'm working on one problem which requires a certain set of files open, then I shift gears to another issue with its own set of open files, I should be able to easily get back to the first set when I want to work on that issue again.
My suggested solution is to be able to bookmark/snapshot certain groups of files (possibly even scroll positions), which can then be named. Later the bookmarked group could be selected from a menu to reopen all of those files.

Add a View For Source Code Editing

Create a view which shows source code, and allows editing of that source. Other features should include lines numbers and APIs which allow providers of syntax highlighting

Ability to color or mark tabs

I would like to be able to quickly identify which open files are related to each other. For example, I might color a service, facade, and DAO the same color to quickly identify it from another group that deals with different data. Additionally, if I am working on files with the same name (such as pages.xml) I know which ones are grouped together.

The easiest way I can think of doing this is coloring or adding some symbol to the tab used to select the open file.

Enable ALL UI Tests to Run Headless in Travis

Previous attempts to get UI tests in Travis were only partially sucessfully. Evaluate information in corona-ide-ui and figure out how to allow the excluded tests to run in CI. This may involve contributions to TestFX Monocle

Dependencies Should Be Assignable to Specific Source Sets

When configuring dependencies on external libraries, it should be possible to limit the source folders which may use a specific library. An example use case for this is differentiating between libraries used to compile source and libraries used for testing

Allow Deleting or Removing a Project Via the UI

Allow Deleting (remove the project and delete from the file system) and removing (remove without deleting from file system) a project in the UI

There are various strategies that may be used to delineate between remove/delete - main goal is clarity and streamlined operation for the most common anticipated case

Projects Should be Portable

With Corona, a project, complete with it's settings, should be portable between instances and developers. Ultimately, it should be possible for a developer to push their project to a repository and have it downloaded by a contributor, with all settings preserved. Some examples of these settings might be:

  • Code formatting
  • Compiler Settings
  • Templates for New Files (useful for license headers)

Show similarly named classes when creating a new class

To avoid name collisions and overly-similar naming that can cause confusion, Corona could show similarly named classes as you're typing in a name for a new class. Similar to how Stackoverflow shows similar questions as you're typing in a question.

IDE/Workspace Settings Should Be Portable

Any settings created for the program, or which are applied at a level above projects (such as a for a working environment) should be exportable and easily applied to other working environments/program instances

Parse and handle git merge conflicts well

When using git, developers may run into merge conflicts. These are represented directly in code as such:

<<<<<<< HEAD
            // code from your branch
=======
            // code from merging-branch
>>>>>>> commit hash or description

In Eclipse the Java parser completely chokes on these extra lines and you get a sea of compile errors. My recommendation is that in Corona we parse the three merge conflict lines and make it visually obvious what is happening. To avoid errors related to part of the conflict referencing classes that don't exist or whatnot I recommend we not even bother trying to compile the code inside the merge chunks

Add Maven Badge

Once libraries on on nexus, ad the badge that links to their location

Add Checkstyle Code Quality Checking

Add Checkstyle to the build process to increase and enforce continued code quality checks on the library. This can be done by adding Checkstyle to the Gradle setup, and defining a rules file.

Based on experience with Alloy, the Gradle modifications will look like (per project to apply to):

apply plugin: 'checkstyle'

checkstyle {
   configFile = rootProject.file('config/checkstyle/checkstyle.xml')
   configProperties = [ 'checkstyle.config.dir' : rootProject.file('config/checkstyle') ]
   toolVersion = '8.18'
}

task checkstyleAll{}

tasks.withType(Checkstyle).all { checkstyleTask -> checkstyleAll.dependsOn checkstyleTask }

check.dependsOn checkstyleAll

And the starting rules file could be:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
          "http://checkstyle.sourceforge.net/dtds/configuration_1_3.dtd">

<!-- Doc for the modules used here may be found at http://checkstyle.sourceforge.net/checks.html -->
<module name = "Checker">
    <property name="charset" value="UTF-8"/>

    <property name="fileExtensions" value="java"/>
    
    <!-- Checks for whitespace                               -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>
    
    <module name="TreeWalker">
    	<!-- Checks that file name = outer class name -->
    	<module name="OuterTypeFilename"/>
        <!-- Checks for unnecessary use of octal/unicode escape characters, which are less readable -->
    	<module name="IllegalTokenText">
            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
            <property name="format"
                      value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
            <property name="message"
                      value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
        </module>
        <!-- Prevents using the unicode escape sequence, which is less reasable -->
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowEscapesForControlCharacters" value="true"/>
            <property name="allowByTailComment" value="true"/>
            <property name="allowNonPrintableEscapes" value="true"/>
        </module>
        <!-- Checks for long lines - Long lines are hard to read in printouts or if developers have limited screen space for the source code -->
        <module name="LineLength">
            <property name="max" value="250"/>
            <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
        </module>
        <!-- Ensures only one top-level class is defined per file, which aids in clarity when navigating a project's APIs -->
        <module name="OneTopLevelClass"/>
        <!-- Checks that import and package statements are not wrapped for readability -->
        <module name="NoLineWrap"/>
        <!-- EmptyBlock and EmptyCatchBlock - Checks for empty control statements, which avoids logic errors and silent removal of error tracking information -->
        <module name="EmptyBlock">
            <property name="option" value="TEXT"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
        </module>
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected"/>
        </module>
        <!-- NeedsBraces, LeftCurly, and RightCurly check that braces are present for control statements, and are consistently placed within the code base -->
        <module name="NeedBraces"/>
        <module name="LeftCurly"/>
        <module name="RightCurly">
            <property name="id" value="RightCurlySame"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
                    LITERAL_DO"/>
        </module>
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone"/>
            <property name="option" value="alone"/>
            <property name="tokens"
                      value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
                    INSTANCE_INIT"/>
        </module>
        <!-- Checks that whitespace is consistently used around things like braces and other constructs -->
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
            <property name="allowEmptyTypes" value="true"/>
            <property name="allowEmptyLoops" value="true"/>
            <message key="ws.notFollowed"
                     value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
            <message key="ws.notPreceded"
                     value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
        </module>
        <!-- Checks that only one statement (; terminated command) is present on each line for more consistent readability -->
        <module name="OneStatementPerLine"/>
        <!-- Checks that variables are each declared in a separate statement and line for more consistent readability -->
        <module name="MultipleVariableDeclarations"/>
        <!-- Enforces a consistent methodology of array declaration within the application -->
        <module name="ArrayTypeStyle"/>
        <!-- Checks for missing "default" clauses in switch statements, as this is a logic bugs -->
        <module name="MissingSwitchDefault"/>
        <!-- Checks for switch statements with associated code, but no ending control statement (continue, break, etc), as this is a logic bug -->
        <module name="FallThrough"/>
        <!-- Checks that Long constant values are defined with an upper-case 'L', as opposed to lower-case (lower can easily be confused for a one) -->
        <module name="UpperEll"/>
        <!-- Enforces consistent following of Java Language Specification modifier order guidelines -->
        <module name="ModifierOrder"/>
        <!-- SeparatorWrap enforces consistent styling of line wraps for given characters (newline before or after the character, etc) for readability -->
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapDot"/>
            <property name="tokens" value="DOT"/>
            <property name="option" value="nl"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapComma"/>
            <property name="tokens" value="COMMA"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapEllipsis"/>
            <property name="tokens" value="ELLIPSIS"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapArrayDeclarator"/>
            <property name="tokens" value="ARRAY_DECLARATOR"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapMethodRef"/>
            <property name="tokens" value="METHOD_REF"/>
            <property name="option" value="nl"/>
        </module>
        <!-- PackageName, TypeName, MemberName, ParameterName, CatchParameterName, LocalVariableName, MethodTypeParameterName and MethodName -->
        <!-- Enforce standardized naming patterns for each of the mentioned Java elements -->
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern"
                     value="Package name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="TypeName">
            <message key="name.invalidPattern"
                     value="Type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MemberName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="CatchParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="LocalVariableName">
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="format" value="^[a-z]([a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Method type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MethodName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
                     value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <!-- Enforces that no 'finalize' method overrides exist, as these behave inconsistently and in-performantly -->
        <module name="NoFinalizer"/>
        <!-- MethodParamPad, NoWhitespaceBefore, ParenPad - Enforces consistent styling and whitespace use for readability -->
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceBefore">
            <property name="tokens"
                      value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
            <property name="allowLineBreaks" value="true"/>
        </module>
        <module name="ParenPad"/>
        <!-- Enforces consistent annotation placement for readability -->
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationMostCases"/>
            <property name="tokens" value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
        </module>
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationVariables"/>
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="allowSamelineMultipleAnnotations" value="true"/>
        </module>
    </module>
</module>

Refactor projects to have unique REST-appropriate identifiers

Since the frontend is now going to interact with the backend in a RESTful way, it would be handy for everything to be addressed by simple unique identifiers (UUIDs probably).

Currently Projects is the only front-facing model I think. This change will probably involve changing how they are keyed in the datastore, and then changing specifically the Delete Project API's path to /projects/{id} instead of just /projects, removing the DeleteProjectRequest class (moving the "also delete from disk" boolean into a query parameter), and then changing the frontend to send the DELETE request that way instead of the current way.

Allow All IDE Settings to Be Generated And Customized By Build System Plugins

Builds systems such as Gradle and Maven have support to generate and customize IDE-specific files. Support for main features in IDEs such as Eclipse and IntelliJ is incomplete and sometimes lacking important features.

As part of the Corona project, plug-ins should be written to support creating a project with the same settings as a project created through the UI, completely from specifications within the build system

Create an External Launcher Program to Start Corona IDE

Users should start Corona IDE through an external launcher. Eventually, this pattern will be leveraged to allow updating the application, and to allow per-workspace plug-ins. The initial requirements are:

  • Allow selection of a workspace
  • Read needed classpath (possibly from a file)
  • Start Corona jar with classpath for specified workspace (classpath as a java arg, workspace a program arg)

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.