groovy-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From pa...@apache.org
Subject [05/15] groovy-dev-site git commit: initial commit
Date Tue, 30 Oct 2018 06:20:18 GMT
http://git-wip-us.apache.org/repos/asf/groovy-dev-site/blob/c2f50e52/wiki/GEP-10.html
----------------------------------------------------------------------
diff --git a/wiki/GEP-10.html b/wiki/GEP-10.html
new file mode 100644
index 0000000..deafb00
--- /dev/null
+++ b/wiki/GEP-10.html
@@ -0,0 +1,531 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-10</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: -14px; right: -14px; border: 0; z-index: 100' src='https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67' alt='Fork me on GitHub' data-canonical-src='https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='https://google.com/+groovy' class='icon'><span class='fa fa-google-plus'></span> Google+ Groovy Page</a>
+                </li><li>
+                    <a href='http://bit.ly/g-community' class='icon'><span class='fa fa-google-plus'></span> Google+ Groovy Community</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='http://groovy-lang.org/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-10</a></li><li><a href='#_abstract_static_compilation' class='anchor-link'>Abstract: Static compilation</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-10</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-10</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Static compilation</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Comment</strong>
+</td>
+<td class="hdlist2">
+<p>Delivered in Groovy 2.0 and enhanced in later versions</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Cédric Champeau</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2011-11-23</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-26</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_static_compilation">Abstract: Static compilation</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>This GEP introduces an experimental new feature in the language known as static compilation.
+Static compilation can be used when the dynamic features of Groovy are not necessary and that the
+performance of the dynamic runtime is too low. The reader must understand that :</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>we do not plan to change the semantics of regular Groovy</p>
+</li>
+<li>
+<p>we want static compilation to be triggered explicitly</p>
+</li>
+<li>
+<p>we want the semantics of static groovy to be as close as possible as the semantics of dynamic Groovy</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_rationale_static_type_checking_vs_static_compilation">Rationale: Static Type Checking vs Static compilation</h3>
+<div class="paragraph">
+<p>Static compilation heavily relies on another feature called Static type checking but it is important to understand
+that they are separate steps. You can statically type check your code, and still have the dynamic runtime at work.
+Static type checking adds type inference to the compilation process. This means that, for example, type arguments
+of method calls are inferred, as well as return types of closures or methods. Those inferred types are used by the
+checker to verify the type flow of your program. When it does so, once must be aware that the static checker cannot
+behave like dynamic Groovy. This means that even if a program passes static type checking, it may behave differently at runtime.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_method_selection">Method selection</h3>
+<div class="sect3">
+<h4 id="_method_selection_in_dynamic_groovy">Method selection in dynamic Groovy</h4>
+<div class="paragraph">
+<p>Groovy supports multimethods. Especially, in dynamic Groovy, target methods are chosen at runtime,
+in opposite to Java which chooses target method at compile time. Let&#8217;s illustrate the difference with an example :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>public void foo(String arg) { System.out.println("String"); }
+public void foo(Object o) { System.out.println("Object"); }
+
+Object o = "The type of o at runtime is String";
+foo(o);</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>In Java, this code will output "Object", because the target method is chosen according to the type of the arguments at compile time.
+The declared type of "o" is Object, so the Object version of the method is chosen. If you want to call the String version,
+you have to define "o" as a "String", or cast o to string in the method call arguments. Now the same example in dynamic Groovy :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void foo(String arg) { println 'String' }
+void foo(Object o) { println 'Object' }
+
+def o = 'The type of o at runtime is String'
+foo(o)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>If you run this snippet, you will see that Groovy prints "String". The reason is that Groovy resolves type arguments at
+runtime and chooses the most specialized version of a method signature when multiple versions are possible.
+To deal with multiple arguments, Groovy computes a distance between the actual type arguments and the declared
+argument types of a method. The method with the best score is chosen.</p>
+</div>
+<div class="paragraph">
+<p>The method selection process is complex, and makes Groovy quite powerful. It is also possible, for example,
+to define metaclasses which will choose different methods, or change the return type of a method dynamically.
+This behaviour is responsible for a large part of the poor performance of Groovy invocation times as compared to Java.
+However, performance has greatly improved with the introduction of call site caching in Groovy.
+Even with those optimizations, Groovy is far for the performance of a pure static language.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_invokedynamic">InvokeDynamic</h4>
+<div class="paragraph">
+<p>InvokeDynamic support is under development and should be introduced in the upcoming Groovy 2.0.
+What InvokeDynamic allows us to do is to, basically, replace call site caching with a native "dynamic method dispatch"
+system directly implemented by the JVM. It is still uncertain what performance improvement we will reach.
+At best, we could be close to the performance of a statically typed language.
+However, as some features are still difficult to implement with InvokeDynamic,
+most likely the performance gain will not be so high. It is important to talk about it though, because :</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>invokedynamic allows JIT optimizations</p>
+</li>
+<li>
+<p>replaces the current dynamic method dispatch without changing the semantics of the language</p>
+</li>
+<li>
+<p>if performance is good, could make static compilation unnecessary</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>However, InvokeDynamic has a major drawback : it will only be available for people using a Java 7+ JVM.
+If we want to deliver Java-like performance for Groovy programs to our users, can we afford leaving
+most of them without such? Most probably, Java 7 won&#8217;t be mainstream before two or three years.</p>
+</div>
+<div class="paragraph">
+<p>Rémi Forax, however, created a backport of invokedynamic for older versions of the JVM.
+Such a backport relies on bytecode transformation to replace invokedynamic instructions with "emulated instructions".
+This "emulated" mode is great for us Groovy developers, because it would allow us to write code once and run it on
+any JVM, but for users, the performance would most probably be bad. To be sure of that, an experiment with backported
+InDy will be made once invokedynamic support is implemented in Groovy core. The most probable situation,
+though, is that performance of such code will remain far from what a static language could provide.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_static_groovy">Static Groovy</h3>
+<div class="sect3">
+<h4 id="_type_inference_based_dispatch">Type inference based dispatch</h4>
+<div class="paragraph">
+<p>This GEP is there to experiment a static compilation mode in Groovy. With what we have explained before,
+you should already understand that statically typed code implies a different behaviour from dynamic code.
+If you expect the statically checked and statically compiled code to behave exactly like dynamic Groovy,
+you should already stop there, or wait for invoke dynamic support to expect improved performance.
+If you perfectly understand that statically compiled code means different semantics,
+then you can continue reading this GEP, and help us choose the best implementation path.
+In fact, there are several options that we will explain here.</p>
+</div>
+<div class="paragraph">
+<p>The current implementation relies on the static type checker, which performs type inference.
+This means that with the previous example :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void foo(String arg) { println 'String' }
+void foo(Object o) { println 'Object' }
+
+def o = 'The type of o at runtime is String'
+foo(o)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The compiler is able to infer that when the foo method is called, the actual type argument will be a string.
+If we compile it statically, the behaviour of this statically compiled program at runtime will be the same as dynamic Groovy.
+With such an implementation, we expect most programs to behave statically like they would in dynamic Groovy.
+However, this will never be always true. This is why we say this behaviour is "as close as possible" as the one of dynamic Groovy.</p>
+</div>
+<div class="paragraph">
+<p>The drawback of this implementation is that the developer cannot easily know what method the compiler chooses.
+For example, let&#8217;s take this example, extracted from a discussion on the mailing list:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void foo(String msg) { println msg }
+void foo(Object msg) { println 'Object' }
+
+def doIt = {x -&gt;
+  Object o = x
+  foo(o)
+}
+
+def getXXX() { "return String" }
+
+def o2=getXXX()
+doIt o2   // "String method" or "Object method"????</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The static type checker infers the type of o2 from the return type of getXXX, so knows that doIt is called with a String,
+so you could suspect the program to choose the foo(String) method. However, doIt is a closure, which can therefore
+be reused in many places, and the type of its "x" argument is unknown. The type checker will not generate distinct
+closure classes for the different call sites where it is used. This means that when you are in the closure,
+the type of 'x' is the one declared in the closure arguments. This means that without type information on 'x',
+x is supposed an Object, and the foo method which will be statically chosen will be the one with the Object argument.</p>
+</div>
+<div class="paragraph">
+<p>While this can be surprising, this is not really difficult to understand. To behave correctly,
+you must either add explicit type arguments to the closure, which is always preferred.
+In a word, in a statically checked world, it is preferred to limit the places where types will be inferred so
+that code is understood properly. Even if you don&#8217;t do it, fixing code is easy, so we think this is not a major issue.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_java_like_method_dispatch">Java-like method dispatch</h4>
+<div class="paragraph">
+<p>The alternative implementation is not to rely on inferred types, but rather behave exactly like Java does.
+The main advantage of this is that the user doesn&#8217;t have 3 distinct method dispatch modes to understand,
+like in the previous solution (Java, dynamic Groovy, inferred static Groovy).
+The major drawback is that the semantics of static Groovy are not close to the ones of dynamic Groovy.
+For this reason, this is not the preferred experimental implementation. If you think this version should be preferred,
+do not hesitate to send an email to the mailing list so that we can discuss.
+You can even fork the current implementation to provide your own.</p>
+</div>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_testing">Testing</h3>
+<div class="paragraph">
+<p>Static compilation is now part of the Groovy 2.0.0 release. You can download the latest Groovy 2 releases and test it.</p>
+</div>
+<div class="sect3">
+<h4 id="_compilestatic">@CompileStatic</h4>
+<div class="paragraph">
+<p>You can try the following snippet :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>@groovy.transform.CompileStatic
+int fib(int i) {
+    i &lt; 2 ? 1 : fib(i - 2) + fib(i - 1)
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This code should already run as fast as Java.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_the_arrow_operator_for_direct_method_calls">The "arrow" operator for direct method calls</h4>
+<div class="paragraph">
+<p>Some users have suggested another idea, related to static compilation, which is the "arrow operator".
+Basically, the idea is to introduce another way of calling methods in Groovy :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>obj.method() // dynamic dispatch
+obj-&gt;method() // static dispatch</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>While this idea sounds interesting, especially when you want to mix dynamic and static code in a single method,
+we think it has many drawbacks. First, it introduces a grammar change, something we would like to avoid as much as possible.
+Second, the idea behind this operator is to perform direct method calls when you <strong>know</strong> the type of an object.
+But, without type inference, you have two problems :</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>even if the type of 'obj' is specified, you cannot be sure that at runtime, the type will be the same</p>
+</li>
+<li>
+<p>you still have to infer the argument types too, which leaves us with the same problem as before: relying on type inference,
+or relying on Java-like behaviour where the method is chosen based on the declared types.
+If we do so, then we would introduce possible incompatibility with the static mode&#8230;&#8203;
+So we would have to choose between this mode and the full static compilation mode.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Imagine the following code :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void write(PrintWriter out) {
+   out-&gt;write('Hello')
+   out-&gt;write(template())
+}
+
+def template() { new MarkupBuilder().html { p('Hello') } }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>While the first call can be resolved easily, this is not the same with the second one.
+You would have to rewrite your code probably this way to have this work :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>void write(PrintWriter out) {
+   out-&gt;println('Hello')
+   String content = template() // dynamic call, implicit coercion to string
+   out-&gt;println(content) // static method dispatch based on declared types only
+}
+
+def template() { new MarkupBuilder().html { p('Hello') } }</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Which is not necessary if you use the @CompileStatic annotation :</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>@CompileStatic
+void write(PrintWriter out) {
+   out.println('Hello')
+   out.println(template())
+}
+
+def template() { new MarkupBuilder().html { p('Hello') } }</code></pre>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508040816/http://docs.codehaus.org/display/GroovyJSR/GEP+10+-+Static+compilation">GEP-10: Static compilation</a> (web archive link)</p>
+</li>
+<li>
+<p><a href="http://blackdragsview.blogspot.com/2011/10/flow-sensitive-typing.html">Flow Sensitive Typing?</a></p>
+</li>
+<li>
+<p><a href="https://web.archive.org/web/20150508040745/http://www.jroller.com/melix/entry/groovy_static_type_checker_status">Groovy static type checker: status update</a> (web archive)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/thread/a4qhxtjzu3wsw6e5">groovy-dev: Static compilation for Groovy</a>:<br>
+An interesting discussion where dynamic lovers explain why they do not want static compilation</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-5138">GROOVY-5138: GEP-10 - Static compilation</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2012-06-21)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-26)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='http://groovy-lang.org/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='https://google.com/+groovy'>Google+ Groovy Page</a></li><li><a href='http://bit.ly/g-community'>Google+ Groovy Community</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2018 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy-dev-site/blob/c2f50e52/wiki/GEP-11.html
----------------------------------------------------------------------
diff --git a/wiki/GEP-11.html b/wiki/GEP-11.html
new file mode 100644
index 0000000..97ae9b6
--- /dev/null
+++ b/wiki/GEP-11.html
@@ -0,0 +1,632 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-11</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: -14px; right: -14px; border: 0; z-index: 100' src='https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67' alt='Fork me on GitHub' data-canonical-src='https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='https://google.com/+groovy' class='icon'><span class='fa fa-google-plus'></span> Google+ Groovy Page</a>
+                </li><li>
+                    <a href='http://bit.ly/g-community' class='icon'><span class='fa fa-google-plus'></span> Google+ Groovy Community</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='http://groovy-lang.org/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-11</a></li><li><a href='#_abstract_groovy_3_semantics_and_new_mop' class='anchor-link'>Abstract: Groovy 3 semantics and new MOP</a></li><li><a href='#_rationale' class='anchor-link'>Rationale</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-11</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-11</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>Groovy 3 semantics and new MOP</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Draft</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Jochen "blackdrag" Theodorou</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2012-06-26</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-28</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_groovy_3_semantics_and_new_mop">Abstract: Groovy 3 semantics and new MOP</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>For quite long we are thinking about a new MOP for Groovy, without finding the right way  to do it better this time.
+It is difficult to find the right path between being user-friendly and efficient.
+Thus the new MOP will contain some features the old did not, but will also remove some old features for
+the sake of a more straight and more easy to understand MOP.</p>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_rationale">Rationale</h2>
+<div class="sectionbody">
+<div class="sect2">
+<h3 id="_removing_default_null_argument">Removing default null argument</h3>
+<div class="paragraph">
+<p>The default null argument is used for method calls that have one parameter,
+but the call is done without an argument for the parameter.
+Groovy will here use null, as long as the type of the parameter is not a primitive.
+In case of a primitive the call fails. This feature was mainly added in the early Groovy pre 1.0 years
+before Groovy supported default values for parameters. Another limitation of this logic is that it works
+only with single parameter methods. There have been multiple cases of confused users by this logic.
+Performance wise this logic doesn&#8217;t cost much, and certainly not more than a call with a real argument.
+But since this is a confusing feature of limited use, it should be removed.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_removing_automatic_list_expansion">Removing automatic list expansion</h3>
+<div class="paragraph">
+<p>A method call done with a list that finds no matching method for that list (a method with one parameter of type List,
+Collection, Object, etc), will cause a second method selection iteration. This time the list is "unpacked" and all
+elements of the list are taken as if the method call had been done with the elements rather than the list.
+Groovy also supports spreading of lists by an syntax element, making this automatic feature not needed.
+In fact this can be quite surprising for users and is a problem for performance.
+A spread version might be still not good in performance, but at least the user will have
+to use an extra symbol and thus have the visual indicator. As of why this feature was originally added is unclear.
+Looking at user code you will find barely intended usages of this. Thus it should be removed.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_changing_safe_navigation_to_stop_evaluation">Changing Safe Navigation to stop evaluation</h3>
+<div class="paragraph">
+<p>Currently an expression like a?.b.c will fail if a is null. It will not evaluate b, but it will try to evaluate c on null.
+This defies the intend of safe navigation to avoid a NullPointerException. Thus this should be changed to stop the
+evaluation of the path expression.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_user_wish_list">User Wish List</h3>
+<div class="ulist">
+<ul>
+<li>
+<p>Instance based Categories by Wujek Srujek<br>
+Instead of having to provide a class with static methods it would be good to be able to feed an instance to the
+use-construct and that then we will use this instance along with its instance methods. This allows instance state to be used.</p>
+</li>
+<li>
+<p>Replacing Introspector by blackdrag<br>
+Not only because of bugs like GROOVY-5019 there should be a replacement of the Introspector</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_some_of_the_leading_design_ideas_of_this_mop">Some of the leading design ideas of this MOP</h3>
+<div class="paragraph">
+<p>The plan is to orientate us a lot on the open call site caching the JVM provides with invokedynamic.
+For this to work all parts of the MOP should no longer be seen as places that do invoke something,
+but as places that return something, that then will be invoked. An invokeMethod then will for example
+return instead an object that acts as a kind of handler, which can be invoked.
+Groovy will then store it and avoid the reselection unless you invalidate it.
+In the old MOP such caching often did not happen once you interact using meta programming.
+The tasks to be solved in this are to provide an "extension point" for intercepting methods and to react to
+missing methods, as well as being able to invalidate a cached version and/or to make an uncached version possible.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_mop2_outline">MOP2 outline</h3>
+<div class="paragraph">
+<p><span class="image"><img src="img/mop_2.jpg" alt="image"></span></p>
+</div>
+<div class="paragraph">
+<p>in meta class of x in pseudo code:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>cachable = getMethodInterceptor(...)
+if (cachable==null) cachable = getFittingMethod(...)
+if (cachable==null) getMethodMissingHandler(...)
+if (cachable==null) throw new MethodMissingException(...)
+storeInCallSite(cachable)
+invoke(cachable)</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>as an explanation to the methods:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>getMethodInterceptor<br>
+Extension point for the user to register an interceptor, that will be used for all method calls.
+This is equal what GroovyInterceptable does using invokeMethod, only that in MOP1 the method is directly called.
+In MOP2 we will instead return a handler that then will do whatever is needed. This can for example be a method
+handle to a invokeMethod method if wanted. TODO: define guards</p>
+</li>
+<li>
+<p>getFittingMethod<br>
+Predefined way to select a method through meta class. This method will return an
+object which then can be used to invoke the selected method.</p>
+</li>
+<li>
+<p>getMethodMissingHandler<br>
+Extension point for the user to register a handler for missing methods.
+The then invoked method is comparable to what methodMissing in MOP1 would be doing.</p>
+</li>
+<li>
+<p>MethodMissingException<br>
+thrown if none of the above methods is bearing a non null result</p>
+</li>
+<li>
+<p>storeInCallSite<br>
+Predefined method to store the cachable result of the above process in the call site.
+As long as the cached object is valid the above methods will not be called again for this call site.</p>
+</li>
+<li>
+<p>invoke<br>
+Predefined method to do the Initial invocation of the cachable. Subsequent invocation may be done directly by invokedynamic.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_context_meta_class">Context Meta Class</h3>
+<div class="paragraph">
+<p>For the MOP2 Groovy will use a system of meta classes with a context element and an always existing default.
+At each call site only one such view will be valid and it will be constant.
+Those views can be used to defined "sealed" meta class, which won&#8217;t get influenced by outside
+meta classes or to allow for example calling private methods and not allowing them in other cases.
+This makes 3 possible meta class variations currently:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Default meta class<br>
+Behaves pretty much like what Java allows in regards of method calls (same class private methods are available)
+and all meta programming changes are visible</p>
+</li>
+<li>
+<p>Sealed meta class<br>
+Like the default meta class, but meta programming changes from outside the class are not visible.
+This can be especially useful to library writers.</p>
+</li>
+<li>
+<p>Test meta class (un)sealed<br>
+Like the two before but with the addition that private members will always be available.</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_getting_a_meta_class">Getting a Meta Class</h3>
+<div class="paragraph">
+<p>Because of the concept of context a class does not have one direct meta class that can be generated without its context.
+The call site defines the place of the context. How the context itself is defined is a TODO.
+As an implementation strategy it is possible to for example use ClassValue to store a table with the context being a key.
+The key would probably have to be available as static information, or as easily computable information.
+Since the resulting meta class could be stored later in the call site object context changes are to be avoided,
+since it implies the invalidation of the call sites using that context.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_general_dispatch_rule_for_methods_and_properties">General dispatch rule for methods (and properties)</h3>
+<div class="paragraph">
+<p>To define the dispatch rules correctly we need to define some terms first:<br>
+<em>Static Sender Class (SSC)</em>:  This is the static information about the class a call is made from.
+If there is for example a class A and a class B extends A, and a call in a method in A,
+then even if your instance is actually a B the SSC will still be A.<br>
+<em>Inheritance based Multimethods</em> (short multimethods from now on): Given a class A and a class B extends A,
+a call made from within A may see a method defined on B as long as the method is visible (not private).
+Groovy defines a special  exception to this though. If the method call from within A is calling a method of the name m,
+then a m from B can only be visible if there is no private m defined in A.</p>
+</div>
+<div class="paragraph">
+<p>Given those two definitions a method call in A will select the set of method to decide from based on this:
+A call m() with the SSC A and done on an instance of B (extends A) will be using the methods defined in A, if A has a private m, otherwise the call is done using B.</p>
+</div>
+<div class="paragraph">
+<p>Calls to Super:<br>
+A call to super in B extends A will have the SSC B, but for the method selection process the super class of SSC (super(SSC)) will be used. In super calls mutimethods are not visible. Thus we can directly use the meta class super(SSC), but we will dispatch only on the public methods of that meta class.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_module_extension_methods_shadowing_rules">Module Extension Methods Shadowing Rules</h3>
+<div class="paragraph">
+<p>Module Extensions Methods are in the old and new MOP defined by the DefaultGroovyMethods related classes and module extension, like groovy-swing. In the definition here we will use the terms of from "inside" and from "outside" to define a callsite, that lies in the same class as the target method (inside) or not (outside). The general rules are:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>public methods are shadowed</p>
+</li>
+<li>
+<p>private methods are shadowed for outside callsites, but not for inside callsites</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Subclasses of the class the module extension method has been applied to have these extended rules:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>if the subclass defines a private method of the same signature as the module extension method, then outside callsites will still see the extension method, inside callsites the private method</p>
+</li>
+<li>
+<p>A call to "super" or "this" will call the module extension method. As such the subclass is seen as outside callsite.</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p>Open Blocks are not seen as separate classes.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_property_discovery">Property Discovery</h3>
+<div class="paragraph">
+<p>Currently MetaClass discovers properties based on the Java Beans conventions.
+It also allows pseudo properties matching a convention on java.beans.EventSetDescriptor.
+This allows the following trick in SwingBuilder for example:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>button(actionPerformed: { println it })</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The pseudo property actionPerformed is inferred from the single method exposed by ActionListener,
+a type of listener that can be registered on a JButton. The code responsible for discovering these
+properties is buried in MetaClassImpl and is not accessible to the outside.
+It would be great if this mechanism be made pluggable.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_the_realm_concept">The Realm concept</h3>
+<div class="paragraph">
+<p>In MOP2 a Realm is a tree like structure containing the meta classes.
+There is a root realm, used as default, but there can be any number of lower realms.
+A meta class change is visible in a realm, if the change is done to the meta class in
+the same realm or to a meta class in a higher realm.
+Script execution engines are able to set a realm for example to prevent them changing meta classes they should not change.
+This can be used for unit tests to isolate meta class changes done during the tests as well.
+A library can have its own realm (defined through an annotation) to prevent other classes to
+leak their changes into that library, while the library can still use a higher realm to make
+changes more public visible, if the realm allows that. Realms can have a setting that prevents
+code executed from there to make changes to higher realms. Calling a method is always done using
+the meta classes from the current realm, even if the called class then calls other classes using
+its own realm. A realm is thus not thread local structure, it is more of a lexical scope.
+A realm can also use a different meta class flavor, to for example allow access to private methods and fields.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_work_items">Work Items</h3>
+<div class="paragraph">
+<p>This part is to guide the implementors with the course of action and planning of the subtasks.</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>make indy the only compilation target in the build</p>
+</li>
+<li>
+<p>move all non-indy bytecode interfacing code to a module, which may be removed later. This includes ScriptBytecodeAdpater as well as all the custom call site caching classes</p>
+</li>
+<li>
+<p>make a new module for MOP2</p>
+</li>
+<li>
+<p>turn meta class into an immutable</p>
+</li>
+<li>
+<p>implement meta class views</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_breaking_changes_trace">Breaking changes trace</h3>
+<div class="paragraph">
+<p><code>groovy.lang.MetaObjectProtocol</code> (currently in <code>groovy.mop.MetaObjectProtocol</code>):</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p><code>getProperties()</code> renamed to <code>getMetaProperties()</code></p>
+</li>
+<li>
+<p><code>getMethods()</code> renamed to <code>getMetaMethods()</code></p>
+</li>
+<li>
+<p><code>respondsTo(Object, String, Object[])</code> changed to <code>respondsTo(String, Object&#8230;&#8203;)</code></p>
+</li>
+<li>
+<p><code>respondsTo(Object, String)</code> replaced by <code>getMetaMethods(String, Class&#8230;&#8203;)</code> with the class argument being null</p>
+</li>
+<li>
+<p>hasProperty(Object,String) replaced by getMetaProperty(String) being null or not</p>
+</li>
+<li>
+<p>getStaticMetaMethod(String, Object[]) replaced by respondsTo(String, Object&#8230;&#8203;) and inspecting the list for static methods</p>
+</li>
+<li>
+<p>getMetaMethod(name, Object[]) replaced by respondsTo(String, Object&#8230;&#8203;) in case the arguments are no classes and getMetaMethods(String,Class&#8230;&#8203;) in case of the arguments being classes</p>
+</li>
+<li>
+<p>invokeConstructor(Object[])NO REPLACEMENT</p>
+</li>
+<li>
+<p>invokeMethod(Object, String, Object[]) NO REPLACEMENT</p>
+</li>
+<li>
+<p>invokeMethod(Object, String, Object) NO REPLACEMENT</p>
+</li>
+<li>
+<p>invokeStaticMethod(Object, String, Object[]) NO REPLACEMENT</p>
+</li>
+<li>
+<p>getProperty(Object, String) replaced by MetaProperty#invoke</p>
+</li>
+<li>
+<p>setProperty(Object, String, Object) replaced by MetaProperty#invoke</p>
+</li>
+<li>
+<p>getAttribute(Object, String) replaced by MetaProperty#getField#invoke</p>
+</li>
+<li>
+<p>setAttribute(Object, String, Object) replaced by MetaProperty#getField#invoke</p>
+</li>
+<li>
+<p><code>getMetaProperty(String)</code>, <code>getTheClass()</code> UNCHANGED</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><code>groovy.lang.MetaMethod</code> is split into a public interface <code>groovy.mop.MetaMethod</code> and an internal default implementation <code>groovy.mop.internal.DefaultMetaMethod</code>.</p>
+</div>
+<div class="paragraph">
+<p>Differences to groovy.mop.internal.DefaultMetaMethod:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>does no longer extend ParameterTypes and does no longer implement Clonable</p>
+</li>
+<li>
+<p>no protected fields nativeParamTypes, parameterTypes and isVargsMethod</p>
+</li>
+<li>
+<p>the constructor MetaMethod() and MetaMethod(Class[]) are removed and partially replaced by DefaultMetaMethod(Class, String, int, MethodHandle) and DefaultMetaMethod(Class, String, MethodType), which uses the MethodType or the MethodHandle to define the parameter classes</p>
+</li>
+<li>
+<p>coerceArgumentsToClasses(Object[]), correctArguments(Object[]), isValidExactMethod(Class[]), isValidExactMethod(Object[]), isValidMethod(Class[]), isValidMethod(Object[]), isVargsMethod(), isVargsMethod(Object[]) NO REPLACEMENT</p>
+</li>
+<li>
+<p>getNativeParameterTypes()replaced by getParameterClasses()</p>
+</li>
+<li>
+<p>equal(CachedClass[], CachedClass[]), equal(CachedClass[], Class[]), checkParameters(Class[]), clone(), doMethodInvoke(Object, Object[]), getDescriptor() NO REPLACEMENT</p>
+</li>
+<li>
+<p>getDeclaringClass(), getModifiers(), getName(), getReturnType(), isAbstract(), isPrivate(), isProtected(), isPublic(), isStatic(), toString() UNCHANGED</p>
+</li>
+<li>
+<p>getMopName(), getSignature(), invoke(Object, Object[]), isCacheable(), isMethod(MetaMethod), isSame(MetaMethod), processDoMethodInvokeException(Exception, Object, Object[]) NO REPLACEMENT</p>
+</li>
+</ul>
+</div>
+<div class="paragraph">
+<p><code>groovy.lang.MetaProperty</code> is split into a public interface <code>groovy.mop.MetaProperty</code> and an internal default implementation <code>groovy.mop.internal.DefaultMetaProperty</code>.</p>
+</div>
+<div class="paragraph">
+<p>Differences to groovy.mop.internal.DefaultMetaProperty:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>the public static field PROPERTY_SET_PREFIX is removed NO REPLACEMENT</p>
+</li>
+<li>
+<p>the protected fields name and type are now private and have to be requested through getName and getType</p>
+</li>
+<li>
+<p>getModifiers(), getName(), getType(), DefaultMetaProperty(String, Class) UNCHANGED</p>
+</li>
+<li>
+<p>getGetterName(String, Class), getSetterName(String)NO REPLACEMENT</p>
+</li>
+<li>
+<p>getProperty(Object) replaced by getter(boolean)</p>
+</li>
+<li>
+<p>setProperty(Object, Object) replaced by setter(boolean)</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508123746/http://docs.codehaus.org/display/GroovyJSR/GEP+11+-+Groovy+3+semantics+and+new+MOP">GEP-11: Groovy 3 semantics and new MOP</a> (web archive link)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_mailing_list_discussions">Mailing-list discussions</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://markmail.org/message/zujumywsb73px2ky">groovy-user: Groovy 3</a></p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_reference_implementation">Reference implementation</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://github.com/groovy/groovy-core/tree/GROOVY_3_FEATURE">GROOVY_3_FEATURE</a><br>
+feature branch on github</p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2013-10-11)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-28)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='http://groovy-lang.org/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='https://google.com/+groovy'>Google+ Groovy Page</a></li><li><a href='http://bit.ly/g-community'>Google+ Groovy Community</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2018 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/groovy-dev-site/blob/c2f50e52/wiki/GEP-12.html
----------------------------------------------------------------------
diff --git a/wiki/GEP-12.html b/wiki/GEP-12.html
new file mode 100644
index 0000000..6a9bad3
--- /dev/null
+++ b/wiki/GEP-12.html
@@ -0,0 +1,513 @@
+<!DOCTYPE html>
+<!--[if lt IE 7]>      <html class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
+<!--[if IE 7]>         <html class="no-js lt-ie9 lt-ie8"> <![endif]-->
+<!--[if IE 8]>         <html class="no-js lt-ie9"> <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js"> <!--<![endif]--><head>
+    <meta charset='utf-8'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='viewport' content='width=device-width, initial-scale=1'/><title>The Apache Groovy programming language - Developer docs - GEP-12</title><link href='..\img/favicon.ico' type='image/x-ico' rel='icon'/><link rel='stylesheet' type='text/css' href='..\css/bootstrap.css'/><link rel='stylesheet' type='text/css' href='..\css/font-awesome.min.css'/><link rel='stylesheet' type='text/css' href='..\css/style.css'/><link rel='stylesheet' type='text/css' href='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.css'/>
+</head><body>
+    <div id='fork-me'>
+        <a href='https://github.com/apache/groovy'>
+            <img style='position: fixed; top: -14px; right: -14px; border: 0; z-index: 100' src='https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67' alt='Fork me on GitHub' data-canonical-src='https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png'/>
+        </a>
+    </div><div id='st-container' class='st-container st-effect-9'>
+        <nav class='st-menu st-effect-9' id='menu-12'>
+            <h2 class='icon icon-lab'>Socialize</h2><ul>
+                <li>
+                    <a href='http://groovy-lang.org/mailing-lists.html' class='icon'><span class='fa fa-envelope'></span> Discuss on the mailing-list</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/groovy-weekly.html' class='icon'><span class='fa fa-envelope-o'></span> Groovy newsletter</a>
+                </li><li>
+                    <a href='https://twitter.com/ApacheGroovy' class='icon'><span class='fa fa-twitter'></span> Groovy on Twitter</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/events.html' class='icon'><span class='fa fa-calendar'></span> Events and conferences</a>
+                </li><li>
+                    <a href='https://github.com/apache/groovy' class='icon'><span class='fa fa-github'></span> Source code on GitHub</a>
+                </li><li>
+                    <a href='http://groovy-lang.org/reporting-issues.html' class='icon'><span class='fa fa-bug'></span> Report issues in Jira</a>
+                </li><li>
+                    <a href='https://google.com/+groovy' class='icon'><span class='fa fa-google-plus'></span> Google+ Groovy Page</a>
+                </li><li>
+                    <a href='http://bit.ly/g-community' class='icon'><span class='fa fa-google-plus'></span> Google+ Groovy Community</a>
+                </li><li>
+                    <a href='http://stackoverflow.com/questions/tagged/groovy' class='icon'><span class='fa fa-stack-overflow'></span> Stack Overflow questions</a>
+                </li><li>
+                    <a href='http://groovycommunity.com/' class='icon'><span class='fa fa-slack'></span> Slack Community</a>
+                </li>
+            </ul>
+        </nav><div class='st-pusher'>
+            <div class='st-content'>
+                <div class='st-content-inner'>
+                    <!--[if lt IE 7]>
+                    <p class="browsehappy">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
+                <![endif]--><div><div class='navbar navbar-default navbar-static-top' role='navigation'>
+                            <div class='container'>
+                                <div class='navbar-header'>
+                                    <button type='button' class='navbar-toggle' data-toggle='collapse' data-target='.navbar-collapse'>
+                                        <span class='sr-only'></span><span class='icon-bar'></span><span class='icon-bar'></span><span class='icon-bar'></span>
+                                    </button><a class='navbar-brand' href='..\index.html'>
+                                        <i class='fa fa-star'></i> Apache Groovy
+                                    </a>
+                                </div><div class='navbar-collapse collapse'>
+                                    <ul class='nav navbar-nav navbar-right'>
+                                        <li class=''><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li class=''><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li class=''><a href='http://groovy-lang.org/download.html'>Download</a></li><li class=''><a href='http://groovy-lang.org/support.html'>Support</a></li><li class=''><a href='..\/'>Contribute</a></li><li class=''><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li><li>
+                                            <a data-effect='st-effect-9' class='st-trigger' href='#'>Socialize</a>
+                                        </li><li class=''>
+                                            <a href='..\search.html'>
+                                                <i class='fa fa-search'></i>
+                                            </a>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div><div id='content' class='page-1'><div class='row'><div class='row-fluid'><div class='col-lg-3'><ul class='nav-sidebar'><li class='active'><a href='#doc'>GEP-12</a></li><li><a href='#_abstract_sam_coercion' class='anchor-link'>Abstract: SAM coercion</a></li><li><a href='#_references_and_useful_links' class='anchor-link'>References and useful links</a></li><li><a href='#_update_history' class='anchor-link'>Update history</a></li></ul></div><div class='col-lg-8 col-lg-pull-0'><a name='doc'></a><h1>GEP-12</h1><p>Author: <i/></p><hr/><div id="preamble">
+<div class="sectionbody">
+<div class="sidebarblock">
+<div class="content">
+<div class="title">Metadata</div>
+<div class="hdlist">
+<table>
+<tr>
+<td class="hdlist1">
+<strong>Number</strong>
+</td>
+<td class="hdlist2">
+<p>GEP-12</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Title</strong>
+</td>
+<td class="hdlist2">
+<p>SAM coercion</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Version</strong>
+</td>
+<td class="hdlist2">
+<p>4</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Type</strong>
+</td>
+<td class="hdlist2">
+<p>Feature</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Status</strong>
+</td>
+<td class="hdlist2">
+<p>Final</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Leader</strong>
+</td>
+<td class="hdlist2">
+<p>Jochen "blackdrag" Theodorou</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Created</strong>
+</td>
+<td class="hdlist2">
+<p>2013-05-30</p>
+</td>
+</tr>
+<tr>
+<td class="hdlist1">
+<strong>Last modification</strong>&#160;
+</td>
+<td class="hdlist2">
+<p>2018-10-29</p>
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_abstract_sam_coercion">Abstract: SAM coercion</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>SAM stands for Single Abstract Method.  SAM coercion is here a Groovy style transformation of a
+<code>groovy.lang.Closure</code> instance into an object suitable for our SAM type.
+A SAM type is an abstract class or interface with a single abstract method. The coercion can happen as part of an assignment or as the result of a method call. Since this transformation might be outside of the types provided by Closure itself, it can be more than a simple Java style cast. Closure becomes a kind of sub type to all SAM types. Groovy has other such transformations without explicit cast or asType usage, which are number object transformations as well as the conversion of GString to String.</p>
+</div>
+<div class="sect2">
+<h3 id="_motivation">Motivation</h3>
+<div class="paragraph">
+<p>Even before Java8 we had discussions about supporting different interfaces with Closure like Runnable and Callable.
+These two being easy cases, any framework can define a myriad of interfaces and abstract classes.
+This then requires to "groovify" the library by writing a helper layer capable of transforming Closure
+objects into something the library then understand. While it is unlikely of this approach to make Groovy
+Builder surplus, it can still help with a more simple integration.</p>
+</div>
+<div class="sect3">
+<h4 id="_meaning_of_single_abstract_method">Meaning of  "Single Abstract Method"</h4>
+<div class="paragraph">
+<p>For a SAM type to be a SAM type according to this GEP an abstract class or interface with a single
+abstract method is required. Any static methods, as well as non-abstract methods are not counted.
+The abstract method may be defined in the SAM class itself, but it can also be a parent.
+The required visibility modifier for the method is public though.</p>
+</div>
+<div class="paragraph">
+<p>SAM examples:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Simple Interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM {
+  def foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Interface with defender method (aka virtual extension method):</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM {
+  def foo()
+  def bar() default { 1 }
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Interface inheriting from another interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface ParentOfSAM {}
+interface SAM extends ParentOfSAM {
+  def foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>Interface inheriting from another interface, but not defining a method on its own:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface ParentOfSAM {
+  def foo()
+}
+interface SAM extends ParentOfSAM {}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>simple abstract class</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class SAM {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class with a abstract and a non abstract method:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class SAM {
+  abstract foo()
+  def bar() { 1 }
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class extending other class:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class ParentOfSAM1 {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class SAM1 extends ParentOfSAM1 {}</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>class ParentOfSAM {
+   def bar() { 1 }
+}
+abstract class SAM2 extends  {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class implementing interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SomeInterface{
+  def foo()
+}
+abstract class SAM1 implements SomeInterface {}
+abstract class SAM2 implements Runnable{}
+interface AnotherInterface {}
+abstract class SAM3 implements AnotherInterface {
+  abstract foo()
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Non-SAM examples:</p>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>empty interface:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SomeMarker {}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>interface with two methods:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface TwoMethods {
+  def foo()
+  def bar()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>abstract class with two abstract methods:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class TwoMethods {
+  abstract foo()
+  abstract bar()
+}</code></pre>
+</div>
+</div>
+<div class="ulist">
+<ul>
+<li>
+<p>empty abstract class:</p>
+</li>
+</ul>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>abstract class Empty {}</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_influence_on_method_selection">Influence on method selection</h4>
+<div class="paragraph">
+<p>The normal method selection algorithm tries to find the most specific method to the given argument
+runtime types and the most general for null. Since a SAM type and a target method parameter type
+are not in an inheritance relation "most specific" needs a redefinition in parts.
+It will be assumed the SAM type is like a direct child of the given target type,
+but if the SAM type is one implemented by Closure (Runnable and Callable),
+then no SAM coercion will be needed. This case is preferred in method selection.
+In case of an overloaded method, where each can be used as target for the SAM coercion,
+method selection will thus fail, regardless their internal relation.
+In Groovy the actual method signature of the SAM type and the coercion target are not important.
+Also it is not important if the target type is an abstract class or an interface.</p>
+</div>
+<div class="paragraph">
+<p>Example of two SAM targets with failing runtime method selection:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM1 { def foo(String s)}
+interface SAM2 { def bar(Integer i)}
+def method(x, SAM1 s1){s1.foo(x)}
+def method(x, SAM2 s2){s2.bar(x)}
+method (1)   {it}  // fails because SAM1 and SAM2 are seen as equal
+method ("1") {it}  // fails because SAM1 and SAM2 are seen as equal</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Example of SAM type being ignore as a non-coercion case is available:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="prettyprint highlight"><code>interface SAM {def foo(String s)}
+def method(SAM s) {1}
+def method(Runnable r) {2}
+assert method {it} == 2</code></pre>
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_influence_on_static_typing_system">Influence on static typing system</h4>
+<div class="paragraph">
+<p>The Scope for the static type system is split into a basic part for Groovy 2.2 and an extended one
+for a later version (2.3 or 3.0)</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_groovy_2_2_static_checks">Groovy 2.2 static checks</h4>
+<div class="paragraph">
+<p>The type checking in Groovy 2.2 will be limited to mimic the behavior of normal Groovy.
+No method signature checks are performed, as well as there will be no additional test or method
+selection based on the type provided by the open block.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_groovy_2_2_static_checks_2">Groovy 2.2+ static checks</h4>
+<div class="paragraph">
+<p>In later versions of Groovy the static type checker has to be improved to refine method selection by the given type
+signature through the open block or lambda. A SAM type is then a fitting type for the coercion only if the provided
+types and the target types in the SAM are matching by number and type itself. A more detailed description can be
+found here: <a href="http://cr.openjdk.java.net/~dlsmith/jsr335-0.6.1/F.html" class="bare">http://cr.openjdk.java.net/~dlsmith/jsr335-0.6.1/F.html</a></p>
+</div>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_references_and_useful_links">References and useful links</h2>
+<div class="sectionbody">
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://web.archive.org/web/20150508054422/http://docs.codehaus.org/display/GroovyJSR/GEP+12+-+SAM+coercion">GEP-12: SAM coercion</a> (web archive link)</p>
+</li>
+</ul>
+</div>
+<div class="sect2">
+<h3 id="_reference_implementation">Reference implementation</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://github.com/groovy/groovy-core/commits/SAM" class="bare">https://github.com/groovy/groovy-core/commits/SAM</a> (feature branch on github)</p>
+</li>
+</ul>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_jira_issues">JIRA issues</h3>
+<div class="ulist">
+<ul>
+<li>
+<p><a href="https://issues.apache.org/jira/browse/GROOVY-6188">GROOVY-6188: Java8 lambda style coercion for Closure</a></p>
+</li>
+</ul>
+</div>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_update_history">Update history</h2>
+<div class="sectionbody">
+<div class="dlist">
+<dl>
+<dt class="hdlist1">3 (2013-07-01)</dt>
+<dd>
+<p>Version as extracted from Codehaus wiki</p>
+</dd>
+<dt class="hdlist1">4 (2018-10-29)</dt>
+<dd>
+<p>Numerous minor tweaks</p>
+</dd>
+</dl>
+</div>
+</div>
+</div></div></div></div></div><footer id='footer'>
+                            <div class='row'>
+                                <div class='colset-3-footer'>
+                                    <div class='col-1'>
+                                        <h1>Groovy</h1><ul>
+                                            <li><a href='http://groovy-lang.org/learn.html'>Learn</a></li><li><a href='http://groovy-lang.org/documentation.html'>Documentation</a></li><li><a href='http://groovy-lang.org/download.html'>Download</a></li><li><a href='http://groovy-lang.org/support.html'>Support</a></li><li><a href='..\/'>Contribute</a></li><li><a href='http://groovy-lang.org/ecosystem.html'>Ecosystem</a></li>
+                                        </ul>
+                                    </div><div class='col-2'>
+                                        <h1>About</h1><ul>
+                                            <li><a href='https://github.com/apache/groovy'>Source code</a></li><li><a href='http://groovy-lang.org/security.html'>Security</a></li><li><a href='http://groovy-lang.org/learn.html#books'>Books</a></li><li><a href='http://groovy-lang.org/thanks.html'>Thanks</a></li><li><a href='http://www.apache.org/foundation/sponsorship.html'>Sponsorship</a></li><li><a href='http://groovy-lang.org/faq.html'>FAQ</a></li><li><a href='http://groovy-lang.org/search.html'>Search</a></li>
+                                        </ul>
+                                    </div><div class='col-3'>
+                                        <h1>Socialize</h1><ul>
+                                            <li><a href='http://groovy-lang.org/mailing-lists.html'>Discuss on the mailing-list</a></li><li><a href='http://groovy-lang.org/groovy-weekly.html'>Groovy newsletter</a></li><li><a href='https://twitter.com/ApacheGroovy'>Groovy on Twitter</a></li><li><a href='http://groovy-lang.org/events.html'>Events and conferences</a></li><li><a href='https://github.com/apache/groovy'>Source code on GitHub</a></li><li><a href='http://groovy-lang.org/reporting-issues.html'>Report issues in Jira</a></li><li><a href='https://google.com/+groovy'>Google+ Groovy Page</a></li><li><a href='http://bit.ly/g-community'>Google+ Groovy Community</a></li><li><a href='http://stackoverflow.com/questions/tagged/groovy'>Stack Overflow questions</a></li><li><a href='http://groovycommunity.com/'>Slack Community</a></li>
+                                        </ul>
+                                    </div><div class='col-right'>
+                                        <p>
+                                            The Groovy programming language is supported by the <a href='http://www.apache.org'>Apache Software Foundation</a> and the Groovy community
+                                        </p><img src='..\img/asf_logo.png' title='The Apache Software Foundation' alt='The Apache Software Foundation' class='img-responsive'/>
+                                    </div>
+                                </div><div class='clearfix'>&copy; 2003-2018 the Apache Groovy project &mdash; Groovy is Open Source, <a href='http://www.apache.org/licenses/LICENSE-2.0.html'>Apache 2 License</a></div>
+                            </div>
+                        </footer></div>
+                </div>
+            </div>
+        </div>
+    </div><script src='..\js/vendor/jquery-1.10.2.min.js' defer></script><script src='..\js/vendor/classie.js' defer></script><script src='..\js/vendor/bootstrap.js' defer></script><script src='..\js/vendor/sidebarEffects.js' defer></script><script src='..\js/vendor/modernizr-2.6.2.min.js' defer></script><script src='..\js/plugins.js' defer></script><script src='https://cdnjs.cloudflare.com/ajax/libs/prettify/r298/prettify.min.js'></script><script>document.addEventListener('DOMContentLoaded',prettyPrint)</script><script>
+          (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+          (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+          m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+          })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+          ga('create', 'UA-257558-10', 'auto');
+          ga('send', 'pageview');
+    </script>
+</body></html>
\ No newline at end of file


Mime
View raw message